题意: 解法: 将t串和s串顺序从前往后匹配,能匹配则匹配,将第i个字符匹配到的位置记为l[i], 将t串和s串逆序从后往前匹配,能匹配则匹配,将第i个字符匹配到的位置记为r[i]. 这样l[i]就是t[i]能匹配的最左位置,r[i]就是t[i]能匹配的最右位置, 枚举i,用r[i]-l[i-1]更新答案即可. code: #include <bits/stdc++.h> #define int long long using namespace std; const int maxm=2e5+5; char s[maxm]; char t[maxm]; int l[maxm]; int r[maxm]; int n,m; signed main(){ cin>>n>>m; scanf("%s",s+1); scanf("%s",t+1); for(int i=1,j=1;i<=n&&j<=m;i++){ if(s[i]==t[j]){ l[j]=i; j++; } } for(int i=n,j=m;i>=1&&j>=1;i--){ if(s[i]==t[j]){ r[j]=i; j--; } } int ans=0; for(int i=2;i<=m;i++){ ans=max(ans,r[i]-l[i-1]); } cout<<ans<<endl; return 0; }