解题思路:
维护一个数值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("Non"); else printf("Yesn"); } return 0; }
12345678910111213141516171819202122232425262728293031323334353637383940