java实现暴力匹配算法详解

1.什么是暴力匹配?

字符串暴力匹配算法是指在一个长字符串中暴力寻找是否包含某一子串
所谓暴力匹配,就是不使用任何其他算法,将两个字符串中的字符一一进行比对。从长字符串的第一个字符开始,判断是否和子字符串的第一个字符相等,如果相等,则在比较后面的字符。
如果第一个字符就不相等,则通过指针后移依次判断长字符串后边的字符是否和第一个字符相等,直到字符串末尾。
一旦在长字符串中匹配到子字符串的第一个字符,就依次再比较后边的字符
如果后边的字符匹配不成功,则重置长字符串索引为当前开始索引的下一个,重置子字符串索引为0,重复前边的步骤。
循环结束条件就是长字符串遍历结束或者子字符串遍历结束。
循环结束后通过判断指向子字符串的索引大小判断是否匹配到,即如果匹配到,则索引大小应该为子字符串长度大小,否则就没有匹配到
匹配到则返回i开始匹配位置的索引,没有匹配到则返回-1。

2.代码示例:

package com.common.utils;

/**
 * @ClassName ViolenceMatch
 * @Description:  用java实现暴力匹配算法代码示例
 * @Author: mischen
 * @date: 19:57 2022/12/8
 * @Version 1.0
 */
public class ViolenceMatch {

    public static void main(String[] args) {
        String str1 = "abcdABCabcdAbcd~GG";
        String str2 = "cd";
        int index = violenceMatch(str1, str2);
        System.out.println("下标为:" + index);
    }

    //实现1
    private static int violenceMatch(String str1, String str2) {
        char[] s1 = str1.toCharArray();
        char[] s2 = str2.toCharArray();
        int len1 = s1.length;
        int len2 = s2.length;
        //分别指向s1和s2
        int i = 0;
        int j = 0;
        //保证匹配时不越界
        while (i < len1 && j < len2) {
            if (s1[i] == s2[j]) {
                i++;
                j++;
            } else {
                i = i - (j - 1);
                j = 0;
            }
        }
        //判断匹配成功
        if (j == len2) {
            return i - j;
        } else {
            return -1;
        }
    }

    /**
     * 实现2
     * @param ptr 文本串
     * @param pat 模式串
     * @return 如果存在,返回这个子串的其实索引,否则返回-1
     */
    private static int violanceMatch2(String ptr, String pat) {
        int N = ptr.length();
        int M = pat.length();
        if(M > N) {
            return -1;
        }

        for(int i=0; i < N - M; i++) {
            int j;
            for(j = 0; j < M; j++) {
                if(ptr.charAt(i + j) != pat.charAt(j)) {
                    break;
                }
            }

            //模式串都匹配成功了
            if(j == M) {
                return i;
            }
        }

        return -1;
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值