内容概述:
给出华华的昵称,有n个好友的昵称,华华只会添加昵称为其子序列的好友,输出各个好友华华会不会添加,"Yes"为会,"No"为不会。好友的昵称长度比华华的短。
题解:
注意:子序列不必连续,相对顺序一致就行。
可以建立一个二维数组第m行,第n列记录:华华昵称中第m个字母右边,ASCII值为n+‘a'的字母离华华昵称中第m个字母最近的位置,第0行记录各个字母最前面的位置。然后输入各个好友的名字依次配对即可。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int next[1000001][26]={0};
string name;
int n;
int i,j,k;
int l;
cin>>name;
l=name.length();
for(i=l-1;i>=0;i--)
{
for(j=0;j<26;j++)
next[i][j]=next[i+1][j];
next[i][name[i]-'a']=i+1;
}
cin>>n;
for(i=0;i<n;i++)
{
cin>>name;
j=0;
k=0;
while(name[j])
{
k=next[k][name[j]-'a'];
if(k==0)
break;
j++;
}
if(name[j]=='\0')
cout<<"Yes\n";
else
cout<<"No\n";
}
return 0;
}