Sunday字符串匹配算法
本来在看KMP算法来着,可是实在是复杂,晦涩难懂,看别人博客了解到KMP算法不仅复杂难懂,效率也不算太高,所以果断抛弃,了解到有其他更高效的算法,如BM算法,但是还有一种更高效的算法–Sunday算法。
Sunday算法的原理很简单,简单高效,这才是我们需要的。
手写描述,不喜勿喷哈哈。
package Suanfa;
public class Sunday {
public void sunday(String mom, String son) {// 将主串定义为mom,将匹配串定义为son
// 将两个字符串转化为字符数组
char[] momChar = mom.toCharArray();
char[] sonChar = son.toCharArray();
// 分别求两个字符数组的长度
int momLen = momChar.length;
int sonLen = sonChar.length;
// i、j分别用来标识主串和匹配串下标
int i = 0;
int j = 0;
// 判断可以匹配多少个子串
int count = 0;
if(momLen<sonLen){
System.out.println("匹配串长度不能大于主串长度!");
}
while (i <= momLen - sonLen + j) {
// 判断最后一次匹配,如果无法匹配,则跳出循环
if (momChar[i] != sonChar[j]) {
if (i == momLen - sonLen + j) {
break;
}
// 返回主串比匹配串多的第一个字符在匹配串中的位置
int pos = contains(sonChar, momChar[i + sonLen - j]);
// 如果下一个字符在匹配串中不存在,则直接跳到再下一个字符
if (pos == -1) {
i = i + sonLen - j + 1;
j = 0;
} else {// 如果存在,将匹配串中的该字符与其对应,再进行匹配
i = i + sonLen - j - pos;
j = 0;
}
} else {
if (j == sonLen - 1) {// 完成一次匹配
count++;
System.out.println("第"+count+"次匹配:起始下标为" + (i - j) + " 结束下标为" + i);
i = i - j + 1;
j = 0;
} else {
i++;
j++;
}
}
}
}
/**
* 返回某一字符在某字符数组中的位置,从后往前遍历,如果不存在该字符则返回-1
*
* @param ch
* @param target
* @return
*/
private int contains(char[] ch, char target) {
// TODO Auto-generated method stub
int len = ch.length;
for (int index = len - 1; index >= 0; index--) {
if (ch[index] == target) {
return index;
}
}
return -1;
}
public static void main(String[] args) {
Sunday sun = new Sunday();
sun.sunday("wuhanligongdaxuexinxiguanli", "ig");
}
}