各种字符匹配算法比较:
package com.bj58.ranguisheng;
/**
* 字符匹配算法测试:
* 输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置
* @author Michael Ran
* @version 2015年3月19日 下午4:17:16
*
*/
public class KMPStrTest {
public static void main(String[] args) {
KMPStrTest kMPStrTest = new KMPStrTest();
System.out.println("开始执行匹配>>>");
System.out.println(kMPStrTest.bruteMatchChildStr("abcsdsddefg","ef"));
System.out.println(kMPStrTest.bruteMatchChildStr("abcssdefg","ef"));
System.out.println(kMPStrTest.bruteMatchChildStr("abcdefg","efg"));
System.out.println(kMPStrTest.bruteMatchChildStr("abcdfg","ef"));
System.out.println(kMPStrTest.bruteMatchChildStr("abcdefxxg","ef"));
System.out.println(kMPStrTest.bruteMatchChildStr("abcdefxxg","eaaaaaaaaaaaaaaaaaf"));
}
/**
* 测试主str中是否包含模式str,如果包含返回第一在主str匹配的位置
* 如果不包含,打印信息并返回-1
* @param mainStr
* @param pattenStr
* @return
*/
public int bruteMatchChildStr(String mainStr,String pattenStr){
int resultReturn = -1;
if(mainStr == null || mainStr.equals("") || pattenStr == null || pattenStr.equals("") || mainStr.length() < pattenStr.length()){
System.out.print("参数不满足条件:");
return -1;
}
System.out.println("---------主串:"+mainStr+"模式串:"+pattenStr+"-------------");
int mainLen = mainStr.length();
int pattenLen = pattenStr.length();
int mainIndex = 0;
int pattenIndex = 0;
while(true){
if(mainStr.charAt(mainIndex) == pattenStr.charAt(pattenIndex) && pattenIndex < pattenLen-1){
mainIndex++;
pattenIndex++;
}
if(mainStr.charAt(mainIndex) == pattenStr.charAt(pattenIndex) && pattenIndex == pattenLen - 1){
System.out.print("找到模式串,位置为:");
resultReturn = mainIndex-(pattenLen-1);
break;
}
if(mainStr.charAt(mainIndex) != pattenStr.charAt(pattenIndex) && mainIndex < mainLen - 1){
mainIndex++;
pattenIndex = 0;
}
if(mainStr.charAt(mainIndex) != pattenStr.charAt(pattenIndex) && mainIndex >= mainLen - 1){
System.out.print("未找到匹配串:");
resultReturn = -1;
break;
}
}
return resultReturn;
}
}