暴力子字符串查找算法的名字虽然很霸气,但是效率不是很高。是一种简单、粗暴的查找方式。
在最坏的情况下,暴力子字符串查找算法在长度为N的文本中查找长度为M的模式需要~NM次字符比较。

核心思想:就是对主串中的每一个字符作为子串的开头,与要匹配的字符串进行匹配。对大串做大循环,每个字符开头做子串的长度的小循环,知道匹配成功或者全部遍历完成为止。

package com.test.test;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** 暴力子字符串查找算法 2015年10月24日 下午6:21:09* * @author 张耀晖**/
public class Test5 {public static void main(String[] args) {Test5 test = new Test5();int index = test.searchFirst("hhh", "wohhhxiaohhhhhhhhh");System.out.println("目标字符串第一次出现的索引位置:" + index);List<Integer> list = test.searchTotal("hhh", "wohhhxiaohhhhhhhhh");System.out.print("目标字符串出现的所有的索引位置:");Iterator iterator = list.iterator();while (iterator.hasNext()) {System.out.print(iterator.next() + ", ");}}/*** 查询目标字符串在总字符串中第一次出现的索引位置* * @param pat*            目标字符串* @param txt*            总字符串* @return 所要查询的字符串第一次出现的索引位置,如果索引为-1就说明不存在。*/public int searchFirst(String pat, String txt) {int index = -1;// 索引int txtLength = txt.length();// 总字符串的长度int patLength = pat.length();// 所要查询的字符串的长度for (int i = 0; i <= txtLength - patLength; i++) {// 控制总字符串比较位置for (int j = 0; j < patLength; j++) {// 控制所要查询的字符串的比较位置if (txt.charAt(i + j) != pat.charAt(j)) {// 在比较中如果有不同的字符就跳出该循环,继续从总字符串的下一个字符开始比较break;} else {if (j == patLength - 1) {// 如果整个目标字符串的内容与总字符串中的内容完全匹配,就返回目标字符串第一次出现的索引位置index = i;return i;}}}}return index;}/*** 查询目标字符串在总字符串中出现的所有的索引位置* * @param pat*            目标字符串* @param txt*            总字符串* @return 保存有查询出来的所有目标字符串在总字符串中出现的索引位置*/public List<Integer> searchTotal(String pat, String txt) {int txtLength = txt.length();// 总字符串的长度int patLength = pat.length();// 所要查询的字符串的长度List<Integer> list = new ArrayList<Integer>();// for (int i = 0; i <= txtLength-patLength; i++) {//// for (int j = 0; j < patLength; j++) {// if(pat.charAt(j)!=txt.charAt(i+j)){// break;// }else{// if(j==(patLength-1)){// list.add(i);// break;// }// }// }//// }// return list;mSearch(pat, txt, patLength, txtLength, 0, list);// 为了实现递归将循环判断比较的内容抽取成一个方法return list;}/*** * @param pat*            目标字符串* @param txt*            总字符串* @param patLength*            目标字符串的长度* @param txtLength*            总字符串的长度* @param index*            目标字符串开始的比较位置* @param list*            用于存储匹配到的目标字符串在总字符串中的索引位置*/public void mSearch(String pat, String txt, int patLength, int txtLength,int index, List<Integer> list) {for (int i = index; i <= txtLength - patLength; i++) {for (int j = 0; j < patLength; j++) {if (pat.charAt(j) != txt.charAt(i + j)) {break;} else {if (j == patLength - 1) {list.add(i);index = i + patLength;// 修改之后查询的总字符串比较位置,防止出现把目标字符串不作为整体看待的情况mSearch(pat, txt, patLength, txtLength, index, list);// 递归return;}}}}}}

运行结果打印:

暴力子字符串查找算法相关推荐

  1. 字符串之子字符串查找

    子字符串查找   字符串的一种基本操作就是子字符串查找:给定一段长度为N的文本text和一个长度为M的模式字符串pattern,在文本中找到一个和该模式相符的子字符串.解决该问题的大部分算法都可以很容 ...

  2. Rabin-Karp 指纹字符串查找算法

    Rabin-Karp 指纹字符串查找算法 M.O.Rabin 和 R.A.Karp 发明了一种完全不同的基于散列的字符串查找算法.我们需要计算模式字符串的散列函数,然后用相同的散列函数计算文本中所有可 ...

  3. C语言检查一个字符串是否为另一个字符串的子字符串的算法(附完整源码)

    C语言检查一个字符串是否为另一个字符串的子字符串的算法 C语言检查一个字符串是否为另一个字符串的子字符串的算法完整源码(定义,实现,main函数测试) C语言检查一个字符串是否为另一个字符串的子字符串 ...

  4. [转载] C++子字符串查找及提取

    参考链接: C++ find()查找子字符串 子字符串查找与提取 strstr()find()查找提取  strstr()与find()均可用于字符串的查找,一个返回的是内存的位置,一个却是目标字符在 ...

  5. KMP(Knuth-Morris-Pratt) 字符串查找算法

    1.背景   我接触到这个算法是在力扣的每日一题中(28. 实现 strStr()),这本来只是一个分类为简单的题目.但是却在官方题解中介绍了这个看似十分复杂的算法.   在官方题解中给出了详细的证明 ...

  6. 字符串查找算法BF、KMP详解

    字符串查找: BF算法: (朴素查找算法) 当查找不成功时,主串返回刚刚起始字符的下一个,子串返回第一个字符位置 时间复杂度:O(n*m) int BF(const char* str, const ...

  7. 459. 重复的子字符串-KMP算法

    459. 重复的子字符串 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成. 示例 1: 输入: s = "abab" 输出: true 解释: 可由子串 & ...

  8. 查找子字符串----KMP算法深入剖析

    假设主串:a b a b c a b c a c b a b       子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c ...

  9. Rabin-Karp字符串查找算法学习:poj1200

    本来准备学习Hash的,结果看PPT讲的第一个算法竟然是跟字符串处理相关的,本来Hash中也有一块专门讲字符串Hash的,就按照<算法导论>中的分类,把这个分到"字符串处理&qu ...

最新文章

  1. onnxruntime c++ 工程实例
  2. python telnet 交互_用Python怎么telnet到网络设备
  3. OpenGL Gouraud着色法的实例
  4. Java基础—序列化底层原理
  5. ogm neo4j_Neo4J OGM与Quarkus
  6. yaml报错TypeError: load() missing 1 required positional argument: ‘Loader‘
  7. spring mvc学习(3):建立第一个动态web项目
  8. 上传jar包到私服(仅限于翼支付公司工作流程使用)和涉及的技术总结
  9. rio indy_RIO Journal是否会成为同类中最开放的?
  10. html模板文件打开空白,Webpack打包index打开空白
  11. 计算机另一账户无法使用office,关闭Word文档提示: 如何处理另一个应用程序或用户正在使用的文件?...
  12. oracle数据库中sql语句性能提升之to_char改造
  13. android studio 如何导入 RecyclerView
  14. LINUX SHELL命令ls只列出目录名
  15. Dilated Convolution(空洞卷积、膨胀卷积)详解
  16. 菲尼克斯电源维修QUINT4-UPS/24DC/24DC
  17. 记录微信会员卡开卡跳过领取到卡包直接到激活页面
  18. 我的世界正版租赁服务器,《我的世界》【PC版】租赁服务器正式版明日就要和大家见面啦~...
  19. GO中时间转换到毫秒
  20. 使用小波包变换分析信号的matlab程序,使用小波包变换分析信号的MATLAB程序

热门文章

  1. 东方卫视演得泰坦机器人_东方卫视《笑傲江湖4》今晚开播,郭德纲、陈赫过招喜剧新人,机器人脱口秀惊艳全场...
  2. 第三方登录如何给前台返回token_如何设计优雅的第三方账号登录?
  3. LeetCode-206 反转链表
  4. 使用vue控制元素显示隐藏
  5. 利用ES6-Promise()方法封装原始jsonp实现跨域请求公用方法(告别使用JQuery封装好的jsonp)
  6. Linux上的node站点之centos配置nodejs运行环境笔记
  7. 1×pbs缓冲液配方_PBS缓冲液的配制
  8. 判断某一天是这一年的第多少天
  9. Linux环境下增加swap交换分区
  10. nginx日志中添加请求的response日志