暴力子字符串查找算法
生活随笔
收集整理的這篇文章主要介紹了
暴力子字符串查找算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
暴力子字符串查找算法的名字雖然很霸氣,但是效率不是很高。是一種簡單、粗暴的查找方式。
在最壞的情況下,暴力子字符串查找算法在長度為N的文本中查找長度為M的模式需要~NM次字符比較。
核心思想:就是對主串中的每一個字符作為子串的開頭,與要匹配的字符串進(jìn)行匹配。對大串做大循環(huán),每個字符開頭做子串的長度的小循環(huán),知道匹配成功或者全部遍歷完成為止。
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("目標(biāo)字符串第一次出現(xiàn)的索引位置:" + index);List<Integer> list = test.searchTotal("hhh", "wohhhxiaohhhhhhhhh");System.out.print("目標(biāo)字符串出現(xiàn)的所有的索引位置:");Iterator iterator = list.iterator();while (iterator.hasNext()) {System.out.print(iterator.next() + ", ");}}/*** 查詢目標(biāo)字符串在總字符串中第一次出現(xiàn)的索引位置* * @param pat* 目標(biāo)字符串* @param txt* 總字符串* @return 所要查詢的字符串第一次出現(xiàn)的索引位置,如果索引為-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)) {// 在比較中如果有不同的字符就跳出該循環(huán),繼續(xù)從總字符串的下一個字符開始比較break;} else {if (j == patLength - 1) {// 如果整個目標(biāo)字符串的內(nèi)容與總字符串中的內(nèi)容完全匹配,就返回目標(biāo)字符串第一次出現(xiàn)的索引位置index = i;return i;}}}}return index;}/*** 查詢目標(biāo)字符串在總字符串中出現(xiàn)的所有的索引位置* * @param pat* 目標(biāo)字符串* @param txt* 總字符串* @return 保存有查詢出來的所有目標(biāo)字符串在總字符串中出現(xiàn)的索引位置*/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);// 為了實現(xiàn)遞歸將循環(huán)判斷比較的內(nèi)容抽取成一個方法return list;}/*** * @param pat* 目標(biāo)字符串* @param txt* 總字符串* @param patLength* 目標(biāo)字符串的長度* @param txtLength* 總字符串的長度* @param index* 目標(biāo)字符串開始的比較位置* @param list* 用于存儲匹配到的目標(biāo)字符串在總字符串中的索引位置*/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;// 修改之后查詢的總字符串比較位置,防止出現(xiàn)把目標(biāo)字符串不作為整體看待的情況mSearch(pat, txt, patLength, txtLength, index, list);// 遞歸return;}}}}}}運行結(jié)果打印:
總結(jié)
以上是生活随笔為你收集整理的暴力子字符串查找算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义ArrayList
- 下一篇: less命令的使用方法