当前位置:编程学习 > C/C++ >>

[LeetCode] Distinct Subsequences

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.

1. 递归比较,超时!!!

[cpp]
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; 
        match(S,T,-1,-1,result); 
        return result; 
    } 
     
    void match(string S, string T, int lastS, int lastT, int &result) 
    { 
        if(lastT==T.length()-1)  
        { 
            result++; 
            return; 
        } 
         
        for(int i=lastS+1;i<S.length();i++) 
        { 
            if(T[lastT+1]==S[i]) 
            { 
                match(S,T,i,lastT+1,result); 
            } 
        } 
         
    } 
}; 

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;
        match(S,T,-1,-1,result);
        return result;
    }
   
    void match(string S, string T, int lastS, int lastT, int &result)
    {
        if(lastT==T.length()-1)
        {
            result++;
            return;
        }
       
        for(int i=lastS+1;i<S.length();i++)
        {
            if(T[lastT+1]==S[i])
            {
                match(S,T,i,lastT+1,result);
            }
        }
       
    }
};
2. dynamic programming:

t[i][j]=the number of distinct subsequences of string T of length i in string  S of length j. So finally the program returns t[t.length][s.length]

If T[i]!=S[j], then t[i][j]=the number of distinct subsequences of string T of length i in string  S of length j-1=t[i][j-1] (the left item in the matrix)

If T[i]==S[j], then t[i][j]=the number of distinct subsequences of string T of length i in string  S of length j-1 + the number of distinct subsequences of string T of length i-1 in string  S of length j-1 = t[i][j-1] + t[i-1][j-1] (the left item in the matrix+the left up item)

 

 

[cpp]
class Solution { 
public: 
    int numDistinct(string S, string T) { 
        // Start typing your C/C++ solution below  
        // DO NOT write int main() function  
        vector<vector<int>> t(T.length()+1,vector<int>(S.length()+1)); 
         
        for(int i=0;i<=T.length();i++) t[i][0]=0; 
        for(int i=0;i<=S.length();i++) t[0][i]=0; 
         
        for(int i=1;i<=S.length();i++) 
        { 
            if(T[0]==S[i-1]) 
                t[1][i]=t[1][i-1]+1; 
            else 
                t[1][i]=t[1][i-1];     
        } 
         
         
        for(int i=2;i<=T.length();i++) 
        { 
            for(int j=1; j<=S.length();j++) 
            { 
                if(T[i-1]==S[j-1]) 
                    t[i][j]=t[i-1][j-1]+t[i][j-1]; 
                else 
                    t[i][j]=t[i][j-1]; 
            } 
        } 
         
        return t[T.length()][S.length()]; 
    } 
}; 

class Solution {
public:
    int numDistinct(string S, string T) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<vector<int>> t(T.length()+1,vector<int>(S.length()+1));
    &n

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,