今天看的 [转自 matrix67.com]KMP算法详解 。然后根据自己的理解写了个java的程序,也不知道自己理解KMP字符串比较算法是否正确,希望大家能多提意见。
package com.dianziermu.arith;
/**
* 字符串比较之KMP算法
*
* @think 思路: <br>
* 如果mainChar[i]==subChar[0],则继续比较mainChar[i+1]和subChar[1]是否相等。 <br>
* 一直相等则一直比较到subChar[subChar.length-1]与主串的是否相等。如果相等则返回i,找到结果结束。 <br>
* 如果有不等的,则比较mainChar[i+1]与subChar[0]是否相等,一直比较下去。 <br>
* 直到循环到mainChar[i+j]时,若i+j+subChar.length>mainChar.length,<br>
* 说明剩余的主串上的字符串不够子串的长度,肯定不会匹配,退出。
* @author 点子二木
* @date 2009-5-4
* @version 1.0
*/
public class KMPMine {
/**
* @param args
*/
public static void main(String[] args) {
String mainStr = "ababaab";
String subStr = "aab";
System.out.println("首索引为:" + KMP(mainStr, subStr));
}
/**
* 比较主串中是否有子串
*
* @param mainStr主串
* @param subStr子串
* @return 有-返回子串在主串中首字母的索引,主串起始索引为0; 无-返回(-1)
*/
private static int KMP(String mainStr, String subStr) {
int comfortIndex = -1;
char[] mainChar = mainStr.toCharArray();
char[] subChar = subStr.toCharArray();
int mainCurrentIndex = 0;// 主串当前索引
int mainEqualIndex = 0;// 正在比较的已经相等的主串起始位置
int subCurrentIndex = 0;// 子串当前索引
int subEqualIndex = 0;// 子串中已经有匹配的个数
while (mainCurrentIndex < mainChar.length) {
// System.out.println("循环"+mainCurrentIndex);
// 循环到剩余的主串上的字符串不够子串的长度,肯定不会匹配,退出
if (mainEqualIndex + subChar.length > mainChar.length) {
return comfortIndex;
}
if (mainChar[mainCurrentIndex] == subChar[subCurrentIndex]) {// 匹配
// 比较到子串最后一位也匹配
if (subEqualIndex == subChar.length - 1) {// 整个都匹配
comfortIndex = mainEqualIndex;
return comfortIndex;
}
// 移动子串的索引
subCurrentIndex++;
mainCurrentIndex++;
subEqualIndex++;
} else {
// 移动整个子串,将当前索引移动到本次整个串比较的的最前端(即mainEqual)的下一位
mainEqualIndex++;
mainCurrentIndex = mainEqualIndex;
subCurrentIndex = 0;
subEqualIndex = 0;
}
}
return comfortIndex;
}
}
运行结果为:
首索引为:4