Sunday字符串匹配算法

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");
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值