标签:就是 哈哈 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算法。。长江后浪推前浪,从简单程度和实际的效果上都碾压各位前辈们哈哈。。。
标签:就是 哈哈 idc abi 哈希 例子 style blog stack
原文地址:https://www.cnblogs.com/dongjl/p/13580432.html