子序列:从原字符串中删除任意个(可以为零、可以为全部)字符得到的新字符串。
https://ac.nowcoder.com/acm/contest/20960/1023
对于给定的仅由小写字母构成的字符串
s
s
s,判断其他
n
n
n 个字符串是不是
s
s
s 的子序列。
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 1e6+3;
int last[30],nxt[maxn][30];
// last[i] 表示某个字母最后出现的位置
// nxt[i][j] 表示股 i 位置后某个字母最先出现的位置
void solve()
{
string s; cin>>s;
memset(last,-1,sizeof(last));
for(int i=s.length()-1;i>=0;i--)
{
for(int j=0;j<26;++j)
{
nxt[i][j]=last[j];
}
last[s[i]-'a']=i;
}
int n; cin>>n;
string t;
while(n--)
{
cin>>t;
int pos=last[t[0]-'a']; // 先定位到第一个字母所在的位置
if(pos==-1) {cout<<"No"<<endl; continue;}
bool flag=1;
for(int i=1;i<t.length();i++)
{
pos=nxt[pos][t[i]-'a'];
if(pos==-1)
{
flag=0;
break;
}
}
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; T=1;
while(T--)
solve();
}