该问题的难点在于序列并非连续,需要精确定位,才能够实现优化。 对于该题目的思路是往往对于每一个位置配备字符查找指针,指向字母第一次出现的位置(后序遍历实现),使得对应的查找问题变的简单,降低时间复杂度, 指针可以是类指针(序列串)

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;
}