7-7 串的模式匹配

给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置。

输入格式:

输入有两行:
第一行是主串S;
第二行是模式T.

输出格式:

输出相匹配的子串中的第一个字符在主串S中出现的位置。若匹配失败,输出0.


输入样例:

在这里给出一组输入。例如:

aaaaaba
ba

输出样例:

在这里给出相应的输出。例如:

6

考察 :  字符串匹配优化

注意 :  这题不需要考虑字符串包含空格 

思路 :  优化是核心


(ps : 这题最普通的find处了最后一个测试点都能过)

C/C++ (简单优化,凑巧过关法)

#include<bits/stdc++.h>
using namespace std;
string s1,s2;

bool flag(long num){
    long length = s2.size(),len = s2.size()/2;
    for(long z=0;z<len;z++) {
        if(s1[z+num]!=s2[z]) return false;
        if(s1[num+length-1-z]!=s2[length-1-z]) return false;  // 判断的时候头尾开始判断
    }
    return true;
}

int main()
{

    cin >> s1 >> s2;
    long len = s1.size()-s2.size();
    for(int z=0;z<=len;z++){
        if(flag(z)) {
            cout << z+1;
            return 0;
        }
    }

    cout << 0 << endl;
    return 0;
}


深度优化的话,应该得先对字符串就行压缩后再就行判断,这边写了压缩函数,如果对后续感兴趣,可自行尝试

string ZIP(string s){
    string result = "";
    long num = 1,length = s.size();
    char flag = s[0];

    for(int z=1;z<length;z++){
        if(flag==s[z]) num++;
        else
        {
            if(num>1) result += to_string(num);
            result += flag;
            num = 1;
            flag = s[z];
        }
    }
    if(num>1) result += to_string(num);
    result += flag;
    return result;
}
//  aaaaaba -> 5aba

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三块不一样的石头

十分满意,一分打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值