字符串:暴力子字符串查找算法

来源:互联网 发布:欧洲为什么发达 知乎 编辑:程序博客网 时间:2024/06/04 22:56

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

这里写图片描述

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

 * 暴力字符串查找  *   * @author Donald-Hu *  2016/8/7 */ public class Violence {      public static void main(String[] args) {         String txt = "adldgkclsldajdc";         String pat = "gkc";          System.out.println(Violence.search(pat, txt));         System.out.println(Violence.searchother(pat, txt));     }       /**     * 使用暴力字符串查找方式,在txt中查找和pat匹配的子字符串     *      * @param pat     *            匹配的模板字符串     * @param txt     *            查找的字符串     * @return 模板字符串第一次出现的位置     */     public static int search(String pat, String txt) {         int M = pat.length();         int N = txt.length();          // 逐个位置匹配模式字符串         for (int i = 0; i < N; i++) {             int j;             for (j = 0; j < M; j++) {                 if (txt.charAt(i + j) != pat.charAt(j)) {                     break;                 }             }              // 找到了匹配的字符串             if (j == M) {                 return i;             }         }         return N;     }       /**     * 使用暴力字符串查找方式的另外一种实现     *      * @param pat     *            匹配的模板字符串     * @param txt     *            查找的字符串     * @return 模板字符串第一次出现的位置     */     public static int searchother(String pat, String txt) {         int M = pat.length();         int N = txt.length();         int i;         int j;          // 逐个位置匹配模式字符串         for (i = 0, j = 0; i < N && j < M; i++) {             if (txt.charAt(i) == pat.charAt(j)) {                 j++;             } else {                 i -= j;                 j = 0;             }         }          // 找到了匹配的字符串         if (j == M) {             return i - M;        } else {             return N;        }     } }


0 0
原创粉丝点击