该问题的难点在于序列并非连续,需要精确定位,才能够实现优化。 对于该题目的思路是往往对于每一个位置配备字符查找指针,指向字母第一次出现的位置(后序遍历实现),使得对应的查找问题变的简单,降低时间复杂度, 指针可以是类指针(序列串)
using namespace std;
string s;
int last[40];
int nxt[1000010][40];
int n, pos, flag;
int main(){
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;
}
cin >> n;
for(int i = 1; i <= n; i++){
string str;
cin >> str;
pos = last[str[0] - 'a'];
flag = 0;
for(int j = 1; j < str.length(); j++){
pos = nxt[pos][str[j] - 'a'];
if(pos == -1){
cout << "No\n";
flag = 1;
break;
}
}
if(!flag) cout << "Yes\n";
}
return 0;
}