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
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战