Brute Force 算法

暴力子字符串查找算法

1、思路

(1)目标字符串String1,指针i,匹配字符串String2,指针j,i、j从0开始匹配

(2)假设现在String1匹配到 i 位置,String2匹配到 j 位置

(3)如果当前字符匹配成功,即str1[i] == str2[j],则i++,j++,继续匹配下一个字符

(4)如果失配,即str1[i]! = str2[j],令i = i - (j - 1),j = 0,相当于每次匹配失败时,i 回溯到初始匹配位置的下一个位置,j被置为0,即回到String2的开头

2、缺点:用暴力方法解决的话就会有大量的回溯,每次只移动一位,若是不匹配,移动到下一位接着判断,浪费了大量的时间

3、在最坏情况下,暴力子字符串查找算法在长度为 N 的文本中查找长度为 M 的模式需要 ≈ N * M 次字符比较

(1)一种最坏的情况是文本和模式都是一连串的 A 接一个 B

(2)那么,对于 N - M + 1 个可能的匹配位置,模式中的所有字符都需要和文本比对,总成本为 M * (N - M + 1)

(3)一般来说 M 远小于 N,因此总成本 ≈ NM

4、时间复杂度:文本串长度为 n,模式串长度为 m

(1)最好 O(m + n)

(2)最坏 O(m * n)

 

代码实现

public class BruteForce {
    
    //暴力匹配算法
    public static int violentMatch(String source, String target) {
        char[] sourceArray = source.toCharArray();
        char[] targetArray = target.toCharArray();
        int i = 0;
        int j = 0;
        while (i < sourceArray.length && j < targetArray.length) {
            if (sourceArray[i] == targetArray[j]) {//字符匹配
                i++;
                j++;
            } else {//字符不匹配
                i = i - (j - 1);
                j = 0;
            }
        }

        if (j == targetArray.length) {//j到达target字符串的尾部,整体匹配成功
            return i - j;//最后一个字符匹配成功,i++、j++都越界1格,相减后相互抵消
        } else {
            return -1;//匹配不成功,返回-1
        }
    }
}

 

posted @   半条咸鱼  阅读(221)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示