程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [LeetCode] Distinct Subsequences

[LeetCode] Distinct Subsequences

編輯:C++入門知識

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));
       
        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()];
    }
};

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved