LC.392. 判断子序列(序列自动机)
思路:
1.暴力
时间复杂度:O( ) ,显然对于一个模式串,暴力的复杂度是很优的。
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.对于多个模式串匹配一个文本串,显然暴力行不通。
这里考虑序列自动机,十分方便,时间复杂度:
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;
}
};