LC.392. 判断子序列(序列自动机)

LC.392. 判断子序列(序列自动机)

思路:

1.暴力

时间复杂度:O( l e n t len_t ) ,显然对于一个模式串,暴力的复杂度是很优的。

class Solution {
public:
    bool isSubsequence(string s, string t) {
         int len=0;
         for(int i=0;i<t.size();i++)
            if(t[i]==s[len]) len++;
         return len==s.size();
    }
};

2.对于多个模式串匹配一个文本串,显然暴力行不通。

这里考虑序列自动机,十分方便,时间复杂度: O ( l e n t + l e n s t o t ) O(len_t+len_{s_{tot}})

class Solution {
public:
    bool isSubsequence(string s, string t) {
         int n=t.size();
         vector<vector<int> >dp(n+2,vector<int>(26,0));
         for(int i=n;i;i--){
             for(int j=0;j<26;j++) dp[i-1][j]=dp[i][j];
             dp[i-1][t[i-1]-'a']=i;
         }
         for(int i=0,p=0;i<s.size();i++){
             p=dp[p][s[i]-'a'];
             if(!p) return false;
         }
         return true;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/107604623
今日推荐