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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 这道题是关于b'7-1'字符模式匹配,需要使用字符匹配算法来实现。常见的字符匹配算法有暴力匹配、KMP算法、Boyer-Moore算法等。其,KMP算法在时间复杂度和实现难度上都有很大优势,所以这里推荐使用KMP算法。 KMP算法的基本思想是使用一个next数组来记录模式前后缀的匹配情况,从而加快匹配的速度。具体实现流程如下: 1.计算出模式的next数组(即前缀表),从而记录下每个位置之前的最长前缀和最长后缀的匹配长度。 2.将模式和文本对齐,从第一个字符开始匹配。 3.如果匹配成功,则继续比较下一个字符;如果匹配失败,则根据next数组移动模式位置。 4.重复2、3步骤,直到匹配完成或者文本已经被扫描完。 在实际实现,需要注意一些边界情况和特殊情况的处理,例如需要初始赋值next[0]=-1,以及在匹配成功后更新next数组等。 总之,KMP算法可以快速高效地实现字符匹配,并且适用范围广泛,是值得掌握的一种算法。 ### 回答2: 7-1 模式匹配是一种计算机算法,用于寻找目标字符是否包含模式字符。该算法可以被广泛应用于文本搜索、数据压缩、图形识别等领域。 该算法核心思想是从目标字符的第一个字符开始,逐个字符地与模式字符进行匹配。当匹配到不同的字符时,算法会将目标字符向右移动一位,重新开始匹配。如果匹配成功,则返回目标字符的匹配位置。 模式匹配可以使用多种算法实现,例如朴素的暴力匹配、KMP算法、Boyer-Moore算法等。这些算法的时间复杂度不同,实际应用时需要根据情况选择最优算法,以提高匹配效率。 在实际应用模式匹配可以帮助程序员快速地定位并处理文本的关键信息,例如搜索引擎的搜索关键字、邮件客户端的过滤器等。同时,该算法也可以用于字符的压缩和加密,如基于哈夫曼编码的数据压缩算法的字符匹配部分。 总之,模式匹配是一种十分重要的算法,它在实际应用有着广泛的应用和重要的作用。 ### 回答3: 7-1 模式匹配是指,在一个长度为 n 的字符,找到一个长度为 m 的模式第一次出现的位置。这是一道经典的字符匹配问题,具有很高的实用和理论意义。本题考察的是的基本算法和数据结构。 一般来说,模式匹配可以使用暴力法、KMP算法、Boyer-Moore算法和Rabin-Karp算法等多种方法。其,暴力法是最基本的方法,但效率较低;KMP算法在实际应用比较常用,可以在O(n+m)的时间复杂度内完成匹配;而Boyer-Moore算法和Rabin-Karp算法则更注重算法的实现效率。 暴力法的基本思路是,对主串的每个字符,从该字符开始与模式的字符依次比较,若不同,则主串向后移动一位,继续比较下一个字符。这种方法的时间复杂度为O(nm),在实际应用效率较低,但对于小规模的问题还是比较有效的。 KMP算法的核心思路是使用一个next数组来预处理模式的信息,即找出模式的最长公共前缀和后缀。在匹配时,若出现了不匹配的情况,则可以利用next数组的信息跳过一部分不必要的比较,从而减少比较的次数。KMP算法的时间复杂度为O(n+m),具有较高的实际应用价值。 Boyer-Moore算法则利用了两种策略:坏字符规则和好后缀规则。其,坏字符规则主要是针对模式的失配字符,而好后缀规则则是针对模式的某个后缀在前面已经出现过的情况。这种算法的时间复杂度为O(n),但需要进行多次预处理,实现较为复杂。 Rabin-Karp算法利用哈希函数完成匹配,同时还可以通过哈希函数的值快速判断两个字符是否等。其主串模式都需要经过哈希处理。该算法的时间复杂度一般为O(n+m),但在最坏情况下可达到O(nm)。 综上所述,不同的算法适合不同的场景,具体选择要根据实际情况做出权衡。在实际应用,KMP算法和Boyer-Moore算法比较常用,而Rabin-Karp算法对较少使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三块不一样的石头

十分满意,一分打赏~

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

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

打赏作者

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

抵扣说明:

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

余额充值