判断字符串t是否为字符串s的子序列
动态规划解法:
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 表示字符串
s
s
s 的前
i
i
i 个字符中是否包含字符串
t
t
t 的前
j
j
j 个字符。
状态转移方程:
if s[i] == s[j]:
dp[i][j] = dp[i-1][j-1]
else :
dp[i][j] = dp[i][j-1]
逐个查找法:
可以依赖于
S
t
r
i
n
g
String
String 自带的
f
i
n
d
find
find 函数进行快速查找
int index=-1;
for(auto it:t){
index=s.find(t,index+1);
if(index==s.npos) return false;
}
return true;
下标记录前驱位置,同时也可找出最短包含子序列的字串
例题
int n=strlen(s+1),m=strlen(t+1);
for(int i=0;i<26;i++) {
vis[i]=inf;
//初始化无法匹配的情况
}
for(int i=1;i<=n;i++){
for(int j=0;j<26;j++){
nxt[i][j]=vis[j];
//记录每个字符作为前驱的位置
}
vis[s[i]-'a']=i;
//更新前驱位置
}
int ans=INT_MAX;
for(int i=1;i<=n;i++){
if(s[i]!=t[m]) continue;
int tmp=i,id=m;
while(tmp!=inf&&id>=1&&s[tmp]!=t[1]){
tmp=nxt[tmp][t[id]-'a'];
//通过前驱的位置不断向前找
id--;
}
if(tmp!=inf) ans=min(ans,i-tmp+1);
}