String匹配算法小节

4 篇文章 0 订阅



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

           字符串匹配相关算法最常用的是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 lkclkc88@sina.com
 * @Date Jul 1, 2014
 * 
 */
public class StringUtil {
/**
* 暴力匹配算法<br>
* 匹配第一个字符串,如果相等,继续向后匹配<br>
* 如果不相等,主串左移动位置1<br>

* @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<br>
* 字符串坐对齐,从右向左匹配字符串<br>
* 如果相等,继续向左进行匹配<br>
* 如果匹配失败,在未匹配的字符中查找失配字符的位置<br>
* 将主串移动距离<br>
* 参考 : http://blog.csdn.net/jjdiaries/article/details/12771439<br>

* @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<Character, Integer> map = new HashMap<Character, Integer>(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);


}
}

             

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值