zoukankan      html  css  js  c++  java
  • Distinct Subsequences

    -----QUESTION-----

    Given a string S and a string T, count the number of distinct subsequences of T in S.

    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.

    -----SOLUTION-----
    class Solution {
    public:
        int numDistinct(string S, string T) {
            int tLen = T.length();
            int sLen = S.length();
            if(sLen == 0) return 0;
            vector<vector<int>> dp(sLen,vector<int>(tLen));  
           
            int i=0;
            int j=0;
            if(S[0]==T[0]) dp[0][0] = 1;
            else dp[0][0]=0;
            for(i = 1; i < tLen; i++)
                dp[0][i]=0;
            for(i = 1 ; i < sLen ;i++)  
                if(S[i]==T[0])  
                    dp[i][0] = dp[i-1][0] + 1;  
                else  
                    dp[i][0] = dp[i-1][0]; 
                    
            for(int i = 1;  i < sLen ; i++)  
                for(int j = 1; j < tLen ; j++)  
                    if(S[i]==T[j])  
                        dp[i][j] = dp[i-1][j-1] + dp[i-1][j];  
                    else  
                        dp[i][j] = dp[i-1][j];  
           return dp[sLen-1][tLen-1];  
        }
    };

    下面做法在Judge Large时,time limit exceeded
    class Solution {
    public:
        int numDistinct(string S, string T) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            int result = 0;
            solve(S,T,0,0,result);
            return result;     
        }
        void solve(const string & S, const string & T, int sPos, int tPos, int & result)
        {
            int tLen = T.length();
            int sLen = S.length();
           
            for (int i = tPos; i< tLen; i++)
            {
                if(sPos >= sLen)
                    return;
                while(S[sPos]!=T[i])
                {
                    sPos++;
                    if(sPos >= sLen)
                        return;
                }          
                sPos++;    
                solve(S,T,sPos,i,result);
            }
            result ++;
        }
    };


  • 相关阅读:
    从头认识java-2.2 算术操作符
    从头认识java-2.1 操作符
    从头认识java-1.8 创建和操纵对象(2)
    从头认识java-1.8 创建和操纵对象(1)
    从头认识java-1.7 单根继承与集合
    从头认识java-1.6 多态
    从头认识java-目录
    颜色
    内部CSS
    外部CSS
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6953079.html
Copyright © 2011-2022 走看看