zoukankan      html  css  js  c++  java
  • 115. Distinct Subsequences

    欢迎fork and star:Nowcoder-Repository-github

    115. Distinct Subsequences

    题目

     Given a string S and a string T, count the number of distinct subsequences of S which equals T.
    
    A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ACE" is a subsequence of "ABCDE" while "AEC" is not).
    
    Here is an example:
    S = "rabbbit", T = "rabbit"
    
    Return 3. 
    

    解析

    • 此题花费很多时间,对递推公式理解不清楚,用一维表示减少空间
    • 对比最大公共子序列和子串
    //115. Distinct Subsequences
    class Solution_115 {
    public:
    
    	int numDistinct(string S, string T) { //母串和子串匹配的次数
    
    		int lenx = T.size(); //子串
    		int leny = S.size(); //母串
    		if (lenx==0||leny==0)
    		{
    			return 0;
    		}
    
    		vector<vector<int> > dp(leny + 1, vector<int>(lenx + 1, 0));
    		for (int i = 0; i <= leny;i++) //遍历母串
    		{
    			for (int j = 0; j <= lenx;j++) //遍历子串
    			{
    				if (j==0)
    				{
    					dp[i][j] = 1; //当子串长度为0时,所有次数都是1
    					continue;
    				}
    				if (i>=1&&j>=1)
    				{
    					if (S[i - 1] == T[j - 1]) //当前母串和子串当前元素相等
    					{
    						dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
    					}
    					else
    					{
    						dp[i][j] = dp[i-1][j];
    					}
    				}
    				
    			}
    		}
    		return dp[leny][lenx];
    	}
    
    	int numDistinct2(string s, string t) {
    		vector<int> match(t.size() + 1);
    		match[0] = 1;
    		for (int i = 0; i<s.size(); i++)
    		for (int j = t.size(); j>0; j--)
    			match[j] += (t[j - 1] == s[i] ? match[j - 1] : 0);
    		return match[t.size()];
    	}
    
    
    	int numDistinct1(string S, string T) {  //bug.计算最长公共子序列
    	//测试用例:
    	//	"ddd", "dd"
    	//	对应输出应该为:3
    	//  你的输出为 : 2
    		int lenx = S.size();
    		int leny = T.size();
    		if (lenx==0||leny==0)
    		{
    			return 0;
    		}
    
    		vector<vector<int>> vecs(leny+1, vector<int>(lenx+1, 0));
    		for (int i = 1; i <= T.size();i++) //行
    		{
    			for (int j = 1; j <=lenx;j++) //列
    			{
    				if (S[j-1]==T[i-1])
    				{
    					vecs[i][j] = vecs[i-1][j - 1] + 1;
    				}
    				else
    				{
    					vecs[i][j] = max(vecs[i - 1][j], vecs[i][j - 1]);
    				}
    			}
    		}
    
    		int cnt = 0;
    		if (vecs[leny][lenx] > 0){
    			cnt++;
    			for (int i = lenx - 1; i > 0; i--)
    			{
    				if (vecs[leny][i] == vecs[leny][lenx])
    				{
    					cnt++;
    				}
    			}
    		}
    
    		return cnt;
    	}
    };
    
    
    

    题目来源

  • 相关阅读:
    Orchard Oracle 支持
    讽刺的是,我在linux下使用最多的命令,竟然是windows的
    学习bash
    提高分布式环境中程序启动性能的一个方法
    MQTT X v1.4.1 正式发布
    社区力量|因为 EMQ,他上了微博热搜
    不止是现在,更关注未来:EMQ 携手高校加强物联网人才培养
    EMQ 助力西安增材制造国家研究院打造增材智能车间平台
    Kuiper 1.0.1 正式发布
    MQTT X v1.4.0 正式发布
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/8228079.html
Copyright © 2011-2022 走看看