BM算法 java代码

本文介绍了BM算法,并提供了一个Java实现的详细代码示例。通过该代码,可以计算字符串匹配中的平移距离,用于高效查找目标串在源串中的位置。在给定的测试用例中,算法成功找到了匹配的位置33。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不废话,直接贴代码

public class BM {

/**

* @param c 源串中字符
* @param s 目标串
* @return 返回平移距离
*/
public static int path(char c , char[] s){
int j=s.length;
//c出现在s最后一位直接返回s.length
if(c==s[j-1]){
return j;
}
//从目标串最后开始匹配
for(int i=j ; i>0 ; i--){
if(c == s[i-1]){
//平移到匹配位置
return j-i;
}
}
//c不出现在目标串中时
return j;
}
/**

* @param p_str 源串
* @param t_str 目标串
* @return -1:错误的输入,-2:目标串和源串不匹配 ,n:匹配的位置在p_str下标为n的位置开始匹配
*/
public static int index(String p_str ,String t_str){
if(t_str.length()>p_str.length() || t_str==null || p_str==null){
return -1;
}
char[] p_char = p_str.toCharArray();
char[] t_char = t_str.toCharArray();
int plen =p_char.length , tlen =t_char.length;
int i=tlen , j;
while(i<=plen){
j=tlen;
//p_char[i-1]与t_char[j-1]若匹配,则进行下一组比较;反之离开循环。
while(j > 0 && p_char[i - 1] == t_char[j - 1]){
i--;
j--;
}
//完美匹配返回其开始匹配的位置
if(j==0){
//如果要匹配多个,这里改为:int pos=i;i = i+tlen+1; --其中每次这个pos就是位置
return i;
}else{
// 把主串下标和模式串均向右滑动一段距离path(p_char[i-1]).即跳过path(p_char[i-1])个字符无需比较
i = i + path(p_char[i - 1], t_char);
}
}
// 不满足while条件,模式串与主串无法匹配
return -1;
}

public static void main(String[] args) {
String p_str = "adsgfasgdfhsdehtr4yhu4dgfbfshsgfasdfasgadsg"; //为了测试,随便敲了段字符
String t_str = "sdf";
System.out.println(index(p_str,t_str));
}
}

运行返回结果为 33

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值