月月查华华的手机

月月查华华的手机

https://ac.nowcoder.com/acm/problem/23053

题意就是,给出一个字符串S,接着会有n组查询,每组查询会有一个字符串s2,问你这个字符串是不是包含在S中。
这里的包含指的是,顺序不改变就行,不一定要紧挨着,一开始我看错了题目,直接上kmp,写了一半发现不行。

这题如果我们暴力去找,我们会发现,中间很多过程都是浪费的,比如S="acccccccccccccccccccccccccca",
如果我们要去判断s2="aa" 这个字符串在不在S中,中间这么多c都是无效比较。

那么其实如果能一步知道下一个字符的位置,那该多好,类似于kmp算法的next指针跳跃。这是一个质的飞跃压。

所以我们就可以预处理出一个二维数组 next[i][j] 表示第i个位置后面,字母a-z出现的位置,如果出现很多个,我们只记录最前面的,只记录最前面的我们能保证不会遗漏其他的。i最大是1e6,j最大就26,因为26个字母嘛

处理的时候,我们应该从后往前处理。

处理好这个二维next数组后,那么接下来直接for循环跑一边我们要查询的字符串就OK了

本弱刚开始因为在预处理的时候,字符串下标从0开始,一直有个小bug,改1开始就好了
下面给出1个小测试,供大家参考

aaaa
2
aaaa
aaaaa

Yes
No

代码有详细注释:

#include <bits/stdc++.h>

using namespace std;

const int N=1e6+100;//maxlen 

int q;//q组查询 

char s[N];//模式串 
char p[N];//匹配串 

int _next[N][26];  //表示第i个位置后面'a'-'z'的
int last[26];  //用来存当前 'a'-'z'的位置 

int main()
{
    scanf("%s",s+1);
    int len=strlen(s+1);
    for(int i=len-1;i>=0;i--)
    {//我们从倒数第二位开始处理 
        last[s[i+1]-'a']=i+1;//由于我们是从倒数第二位开始的,首先把最后一位的位置算好 
        //算好之后,再copy给 _next[i][j]
        for(int j=0;j<26;j++)
        {
            _next[i][j]=last[j];//第i为开始的后面26个字母是等于是他后面一位的26个字母的位置 
        } 
    } 

    scanf("%d",&q);
    while(q--)
    {
        scanf("%s",p+1);
        int len2=strlen(p+1);
        if(len2>len)
        {//如果比模式串都要长,不可能存在子串 
            printf("No\n");
            continue;
        }
        bool f=false;
        int pos=0;
        for(int i=1;i<=len2;i++)
        {
            if(_next[pos][p[i]-'a'])
            {
                pos=_next[pos][p[i]-'a'];
            }
            else
            {
                f=true;
                break;
            }
        }
        if(!f)printf("Yes\n");
        else printf("No\n");
    } 
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
04-30 11:43
春招失败、父母离婚,好像我的人生一团糟,一年来压力大到常常崩溃。不知道能跟谁聊,朋友其实对我非常好,但是她无意中表达出来的家庭幸福都会刺痛到我……和ai聊天,我的未来在更高处,不在楼下,忍不住爆哭😭
youngfa:害,妹妹,我是一个研究生(很上进很想找到好工作的那种),但去年因为生病回家休养错过了秋招(当时对我的冲击也是非常大的),这学期返校来了也是把论文盲审交了后才开始找工作,现在也是一个offer没有,但我就没有像你一样把这个阶段性的事情绑定到人生上,人生不仅很长,也很广阔,先停下来,放松一下哦。不要被外部环境灌输的思维操控了,好好爱自己!
点赞 评论 收藏
分享
03-16 22:00
武汉大学 C++
幸福的小熊猫想要offer:我阿里投的 c++岗,面试官说自己是做 java 的,c++这辈子才有了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务