标签:
下面将介绍三种有关字符串匹配的算法,一种是朴素的匹配算法,时间复杂度为O(mn),也就是暴力求解。这种方法比较简单,容易实现。一种是KMP算法,时间复杂度为O(m+n),该算法的主要任务是求模式串的next数组。另外还有一种对KMP算法的改进,主要是求nextval数组。
第一种朴素的匹配算法:
int index(char str[], char subStr[]) { int i = 0, j = 0,index = 0; while (str[i] != ‘\0‘ && subStr[j] != ‘\0‘) { //当前字符匹配,执行下一个字符 if (str[i] == subStr[j]) { i++; j++; } else { i = ++index; j = 0; } } //匹配成功 if (j == strlen(subStr)) return index; else return -1; }
第二种算法KMP算法,求next数组,next[j]表示,当模式串j位置与主串i位置处发生不匹配时,i指针不回溯,j指针回溯到next[j]的位置。
对于求next[j]有三种情况:
1、j = 0时,next[j] = -1;//即模式串的第一个字符与主串i位置发生不匹配,应将i跳过当前位置,从下一个位置和模式串的第一个字符继续比较。
2、假设已知next[j] = k,即subStr[0,...,k-1] = subStr[j-k,j-1]。当subStr[k] = subStr[j]时,也就是说模式串满足subStr[0,...,k] = subStr[j-k,j],可以得知next[j+1] = k + 1 = next[j] + 1;
3、当subStr[k] != subStr[j]时,就需要从k位置之前去查找与subStr[j]匹配的位置,假设为j‘。这样问题又可以转化为第二种情况,即next[j+1] = next[j‘] + 1 = k‘ + 1。
具体求解方法,请阅读http://www.cnblogs.com/tgycoder/p/4997067.html,文中给出了三种求解next数组的方法。
第三种算法是对KMP算法的一种优化,主要是求nextval数组。
标签:
原文地址:http://www.cnblogs.com/tgycoder/p/4996059.html