月月查華華手機(字符串操作)

在這裏插入圖片描述
解題思路:
維護一個數值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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章