码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 28.实现strStr()

时间:2020-09-09 18:53:26      阅读:33      评论:0      收藏:0      [点我收藏+]

标签:就是   哈哈   idc   abi   哈希   例子   style   blog   stack   

这题就是典型的字符串匹配问题。实现方法可谓极多。而且网上教程实在很详尽了。故不多赘述啦。贴我个人码了一遍的代码。。

感兴趣的直接参考下面这些大神的博客哈哈 

https://www.zhihu.com/question/21923021

http://www.voidcn.com/article/p-gcxakovf-sg.html

https://www.cnblogs.com/chentianwei/p/11665656.html

 

设主字符串的长度为N,匹配模式串的长度为L

第一种,老老实实暴力算法。。。理论最坏时间复杂度O((N-L)*L),空间复杂度 O(1)。不过leetcode上的测试集测试后效果居然也还不错了,时间和空间性能都超过百分之八十了。。

class Solution {
public:
    int strStr(string haystack, string needle) {
        int len1=haystack.length();
        int len2=needle.length();
        if(len2==0)return 0;
        if(len2>len1)return -1;
        int k=0;
        int i,j;
        for (i = 0; i <len1-len2+1; ++i) {
            k=i;
            for(j=0;j<len2;++j){
                if(haystack[k++]!=needle[j])
                    break;
            }
            if(j==len2)
                return i;
        }
        return -1;
    }
};

 

可以看到,以上遍历比较的过程,其实比较的途中有些信息是可以记录下来的,下次比较的位置就不一定需要从主字符串的索引的下一位开始,中间可以跳过几个。这是其他字符串匹配算法优化的主要思路。

 

第二种算法,Rabin Karp

这个算法的时间复杂度是O(N)。如何比较字符串呢?不根据字符一个个比较啦。直接将模式串转为哈希码(计算规则是位权重累加,对和求余数),然后在遍历主字符串的时候呢,对每个L长度的子串也先转化为哈希码,然后再比较哈希码即可。。

哈希码的计算,考虑每个子串是在上个子串的基础上出去一个进去一个字符,故在上一个哈希码基础上加个数减个数即可。实现代码略。。这个算法相较于暴力算法的优点是,对于模式串比较长的数据集,这个比较的过程能节省比较多的时间。

 

第三种算法,KMP算法

算法书里很经典的例子啦。就不赘述了。理论效果虽然不错,但实际表现并不好,而且确实对于新手难以理解啊。

 

第四种算法,Horspool算法。开创性地提出从右向左匹配。

 

第五种算法,Boyer-Moore 算法。理论效果和KMP差不多。但是实际效果好很多。。

 

第六种算法,Sunday算法。。长江后浪推前浪,从简单程度和实际的效果上都碾压各位前辈们哈哈。。。

 

leetcode 28.实现strStr()

标签:就是   哈哈   idc   abi   哈希   例子   style   blog   stack   

原文地址:https://www.cnblogs.com/dongjl/p/13580432.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!