题意
有一个字符串,有一些匹配串,问匹配串是否是字符串的子序列。(子串是连续的,子序列是递增非连续的)
分析
显然我们可以贪心的去匹配,尽量匹配前面出现的字符。
然后我们可以定义一个数组,代表下一个字母出现的位置。
然后我们不停的跳就可以了。
#include <bits/stdc++.h> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pii pair<int,int> const int inf = 0x3f3f3f3f; const int maxn = 1001110; const int M = 1e9+7; int n,m; char s[maxn],t[maxn]; int nex[maxn][26]; signed main() { cin>>(s+1); n = strlen(s+1); for(int i = 0; i < 26; i++) { nex[n][i] = n+1; } for(int i = n-1; i >= 0; i--) { for(int j = 0; j < 26; j++) { nex[i][j] = nex[i+1][j]; } nex[i][s[i+1]-'a'] = i+1; } cin>>m; while(m--) { cin>>(t+1); int sz = strlen(t+1); bool ok = true; int k = 0; for(int i = 1; i <= sz && ok; i++) { k = nex[k][t[i]-'a']; if(k > n) ok = 0; } if(ok) puts("Yes"); else puts("No"); } return 0; }