之前一直用的kmp来做字符串的匹配题目,直到今日才知道还有sunday这种高效又简单的算法,虽然不能百分之一万的保证准确性,我也没有看sunday算法的相关证明,不过学习了之后确实觉得巧妙,今天我就好好写写这两种算法。
第一 经典的kmp:
kmp的核心就是求next数组,而求next数组,主要就是以下几步:
每一个next[i]的值都代表着i前面的字符的最大回文长度。因此,我们设next[0]=-1,因为位置0前面没有字符,然后设next[1]=0,因为1前面只有0一个字符·,所以为零。
然后我们将一个计数器记零,这是当前最大kmp匹配长度+1,将要求的next的位置指针指向2,然后一路往下,
匹配的规则就是:看当前位置的字符与计数器所在的字符是否相等,因为之前的是最长字符串,已经匹配完了,都相等,如果这个字符也相等,那么当前位置的next值就是上一个next加一。如果不相等,就要把计数器跳到最长字符串的尾端的位置的next,找到最长字符串里面的最长回文字符串,看看是不是相等,直到相等加一,或者计数器跳至负一,游戏结束,将next置零。
现在看实现:
void getnext(vector<int> &next,string str){
next[0]=-1;
next[1]=0;
int pos=2;
int kmp=0;
while(pos<str.size()){
if(str[pos-1]=&#