解題思路:
維護一個數值Next[i][j],表示第i個位置之後第一次出現j的位置,首先從前往後遍歷字符串,初始化Next,Next[i-1][arr[i]-‘a’]=i,然後從後往前處理Next數組,相當於每次向前傳遞位置i後第一次出現的字母的位置信息,遍歷到位置0結束,注意只有一個字符的特殊情況。
代碼:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e6+10;
int Next[maxn][26];
char arr[maxn];
int main()
{
scanf("%s",arr+1);
int len1=strlen(arr+1);
for(int i=1;i<=len1;++i)
Next[i-1][arr[i]-'a']=i;
for(int i=len1-1;i>=0;--i)
{
for(int j=0;j<26;++j)
if(!Next[i][j])
Next[i][j]=Next[i+1][j];
}
int n;
scanf("%d",&n);
while(n--)
{
string temp;
int x=0,flag=0;
cin>>temp;
int len2=temp.size();
for(int i=0;i<len2;++i)
{
x=Next[x][temp[i]-'a'];
if(!x)
{
flag=1;
break;
}
}
if(flag) printf("No\n");
else printf("Yes\n");
}
return 0;
}