字符串

月月查华华的手机

http://www.nowcoder.com/questionTerminal/c2877187b1bb4573927e759a60f5d3e1

思路:
首先可以想到一个暴力的做法就是拿子串与模式串一一匹配,时间复杂度O(n^2)(讲道理这个应该是过不了的,但是我居然过了。。)
然后就是考虑一下怎么优化,(看的题解,感觉挺奇妙的)就题目不是说字符串只可能是小写字母[a,z],那么我们可以构造一个next[i][j]:表示模式串第i个字符到字符j的下标,有了一个东西如果我们进行匹配的话就可以省去多余的没用的匹配,比如abcdef,子串ac,我们匹配完a,直接next[a][c] = 3,这样就直接去和第三个字符匹配,那么next数组怎么构造呢,还需要一个last[i]:表示字符i距离前面字符的最近位置,这样从后往前面扫就可以构造next数组了。然后这题就出来了。
O(n^2)代码:

#include<bits/stdc++.h>
using namespace std;

void solved(){
    string mo;cin>>mo;
    int n;cin>>n;
    vector<string>ve;
    for(int i = 1; i <= n; i++){
        string a;cin>>a;
        ve.push_back(a);
    }
    //noiauwfaurainairtqltqlmomomo
    //1
    //ooooo
    for(int i = 0; i < ve.size(); i++){
        string s = ve[i];
        int cnt = 0;
        int r = 0;
        for(int i = 0; i < s.size(); i++){
            while(s[i] != mo[r] && r < mo.size())r++;
            if(s[i] == mo[r]){cnt ++; r++;}
            if(r >= mo.size())break;
        }
        if(cnt == s.size())cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
}
int main(){
    solved();
    return 0;
}

O(26n)代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e6 + 10;
char mo[maxn];
char pi[maxn];
int nxt[maxn][30];
int last[100];
//next[i][j]:表示模式串中第i个字符到字符z的位置 j=[a,z] 
void solved(){
    scanf("%s",mo + 1);
    int n;cin>>n;
    int len = strlen(mo + 1);
    memset(last,-1,sizeof(last));
    for(int i = len; i >= 0; i--){
        for(int j = 1; j <= 26; j++){
            nxt[i][j] = last[j];//第i个字符到字符j的位置 
        }
        last[mo[i] - 'a' + 1] = i;
    }

    while(n--){
        scanf("%s",pi + 1);
        int len = strlen(pi + 1);
        int k = nxt[0][pi[1] - 'a' + 1];
        //cout<<k<<endl;
        if(k == -1){
            cout<<"No"<<endl;continue;
        }
        for(int i = 2; i <= len; i++){
            k = nxt[k][pi[i] - 'a' + 1];
            if(k == -1)break;
        //    cout<<k<<endl;
        }
        if(k != -1)cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
}
int main(){
    solved();
    return 0;
}
全部评论

相关推荐

NBA球星伦纳德:jd是这样的,工作连拧螺丝都算不上
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# AI面会问哪些问题? #
24847次浏览 491人参与
# 中国电信笔试 #
31080次浏览 283人参与
# 米连集团26产品管培生项目 #
12951次浏览 285人参与
# 你的实习产出是真实的还是包装的? #
18817次浏览 330人参与
# 如果秋招能重来,我会____ #
96691次浏览 500人参与
# 春招至今,你的战绩如何? #
59982次浏览 543人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
14144次浏览 209人参与
# i人适合做什么工作 #
36914次浏览 124人参与
# 我是面试官,请用一句话让我破防 #
79511次浏览 219人参与
# 哪些公司真双非友好? #
69200次浏览 287人参与
# 金三银四,你的春招进行到哪个阶段了? #
21567次浏览 277人参与
# 找AI工作可以去哪些公司? #
7673次浏览 186人参与
# 从事AI岗需要掌握哪些技术栈? #
7676次浏览 251人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
339915次浏览 2165人参与
# 面试尴尬现场 #
220755次浏览 861人参与
# 五一之后,实习真的很难找吗? #
102797次浏览 584人参与
# 你做过最难的笔试是哪家公司 #
30108次浏览 193人参与
# 你小时候最想从事什么职业 #
159840次浏览 2072人参与
# 应届生第一份工资要多少合适 #
20483次浏览 84人参与
# 阿里笔试 #
176460次浏览 1302人参与
# 一张图晒出你司的标语 #
3821次浏览 72人参与
# 面试被问期望薪资时该如何回答 #
382459次浏览 2163人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务