String匹配算法小节



             最近闲来无事,看看了字符串匹配相关的算法。

           字符串匹配相关算法最常用的是KMP,BM算法了吧,虽然勉强将代码写出来了,但个人数学功底有现,理解起来太困难,我认为完全没有理解KMP,BM算法的精髓,最近看到了BM的改进算法Horspool已经sunday算法,对这两个算法的理解比较透彻,也是弥补对KMP,BM算法的遗憾。

           学习过程中,想过算法的理解,参考了http://blog.csdn.net/jjdiaries/article/details/12771439 的文章。


         个人实现代码如下


package string;


import java.util.HashMap;
import java.util.Map;


/**
 * @comment:
 * @author [email protected]
 * @Date Jul 1, 2014
 * 
 */
public class StringUtil {
/**
* 暴力匹配算法

* 匹配第一个字符串,如果相等,继续向后匹配

* 如果不相等,主串左移动位置1


* @param source
* @param target
* @return
*/
public static int BF(String source, String target) {
char[] sChs = source.toCharArray();
char[] tChs = target.toCharArray();
sub: for (int i = 0, size = sChs.length - tChs.length; i < size; i++) {
for (int j = 0, length = tChs.length; j < length; j++) {
if (tChs[j] != sChs[i + j]) {
continue sub;
}
}
return i;


}


return -1;
}


/**
* 从后向前暴力匹配算法

* @param source
* @param target
* @return
*/
public static int endB(String source, String target) {
char[] sChs = source.toCharArray();
char[] tChs = target.toCharArray();
sub: for (int i = sChs.length - tChs.length; i > -1; i--) {
for (int j = 0, length = tChs.length; j < length; j++) {
if (tChs[j] != sChs[i + j]) {
continue sub;
}
}
return i;


}


return -1;
}


/**
* 寻找失配字符的位置,如果不存在返回-1

* @param chs
* @param ch
* @param end
* @return
*/
private static int find(char[] chs, char ch, int end) {
while (end > -1) {
if (chs[end] == ch)
break;
end--;
}
return end;
}


/**
* BM算法变种Horspool

* 字符串坐对齐,从右向左匹配字符串

* 如果相等,继续向左进行匹配

* 如果匹配失败,在未匹配的字符中查找失配字符的位置

* 将主串移动距离

* 参考 : http://blog.csdn.net/jjdiaries/article/details/12771439


* @param source
* @param target
* @return
*/
public static int BMH(String source, String target) {
char[] sChs = source.toCharArray();
char[] tChs = target.toCharArray();
sub: for (int i = 0, size = sChs.length - tChs.length + 1; i < size;) {
for (int j = tChs.length - 1; j > -1; j--) {
if (tChs[j] != sChs[i + j]) {
i += j - find(tChs, sChs[i + j], j);
continue sub;
}
}
return i;
}


return -1;
}


/**
* sunday匹配算法

* @param source
* @param target
* @return
*/
public static int sunday(String source, String target) {
char[] sChs = source.toCharArray();
char[] tChs = target.toCharArray();
/**
* 预先计算index
*/
Map map = new HashMap(tChs.length, 1.0f);
for (int i = 0, size = tChs.length; i < size; i++) {
map.put(tChs[i], i);
}
/**
* 匹配
*/
sub: for (int i = 0, size = sChs.length - tChs.length + 1; i < size;) {
for (int j = 0, length = tChs.length; j < length; j++) {
if (tChs[j] != sChs[i + j]) {
Integer index = map.get(sChs[i + tChs.length]);
if (null == index) {
index = -1;
}
i += tChs.length - index;
continue sub;
}
}
return i;
}
return -1;
}


public static void main(String[] args) {
String source = "abcdeftefdafccdfdsafxxcsd";
String target = "csd";
// int i = BF(source, target);


int i = sunday(source, target);
// int i = BMH(source, target);


System.out.println(i);


}
}

             

你可能感兴趣的:(总结,JAVA)