博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
子字符串查找
阅读量:5243 次
发布时间:2019-06-14

本文共 2356 字,大约阅读时间需要 7 分钟。

1 暴力破解

 

java实现如下:

1 public class Naive { 2  3     /** 4      * 暴力破解 5      * 6      * @param pat 7      * @param txt 8      * @return 9      */10     private static int search(String pat, String txt) {11         int m = pat.length();12         int n = txt.length();13         for (int i = 0; i <= n - m; i++) {14             int j;15             for (j = 0; j < m; j++) {16                 if (txt.charAt(i + j) != pat.charAt(j)) {17                     break;18                 }19             }20             if (j == m) {21                 return i;22             }23         }24         return n;25     }26 27     public static void main(String[] args) {28         int pos = search("abcabd", "abcabcabdabba");29         System.out.println(pos);30     }31 32 }

 最坏的情况是:

常见的是二进制情况下的匹配:

 

 

 

2 KMP算法

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

 

所以,kmp方法算法就利用之前判断过信息,通过一个next数组,保存模式串中前后最长公共子序列的长度,每次回溯时,通过next数组找到,前面匹配过的位置,省去了大量的计算时间。

1 public class KMP { 2     public static int KMP(String pat, String txt) { 3         char[] t = pat.toCharArray(); 4         char[] p = txt.toCharArray(); 5  6         int i = 0; // 主串的位置 7         int j = 0; // 模式串的位置 8         int[] next = getNext(txt); 9 10         while (i < t.length && j < p.length) {11             if (j == -1 || t[i] == p[j]) { // 当j为-1时,要移动的是i,当然j也要归012                 i++;13                 j++;14             } else {15                 // i不需要回溯了16                 // i = i - j + 1;17                 j = next[j]; // j回到指定位置18             }19         }20 21         if (j == p.length) {22             return i - j;23         } else {24             return -1;25         }26     }27 28     public static int[] getNext(String ps) {29         char[] p = ps.toCharArray();30         int[] next = new int[p.length];31         next[0] = -1;32 33         int j = 0;34         int k = -1;35         while (j < p.length - 1) {36             if (k == -1 || p[j] == p[k]) {37                 next[++j] = ++k;38             } else {39                 k = next[k];40             }41         }42         return next;43     }44 45     public static void main(String[] args) {46         String pat = "abcabd";47         String txt = "abcabcabdabba";48         int pos = KMP(pat, txt);49         System.out.println(pos);50     }51 52 }

 

kmp算法的核心时间复杂度就是O(m+n) 

 

转载于:https://www.cnblogs.com/zcjcsl/p/9806918.html

你可能感兴趣的文章
KDESVN中commit时出现containing working copy admin area is missing错误提示
查看>>
利用AOP写2PC框架(二)
查看>>
【动态规划】skiing
查看>>
java定时器的使用(Timer)
查看>>
ef codefirst VS里修改数据表结构后更新到数据库
查看>>
boost 同步定时器
查看>>
[ROS] Chinese MOOC || Chapter-4.4 Action
查看>>
简单的数据库操作
查看>>
解决php -v查看到版本与phpinfo()版本不一致问题
查看>>
iOS-解决iOS8及以上设置applicationIconBadgeNumber报错的问题
查看>>
亡灵序曲-The Dawn
查看>>
Redmine
查看>>
帧的最小长度 CSMA/CD
查看>>
xib文件加载后设置frame无效问题
查看>>
编程算法 - 左旋转字符串 代码(C)
查看>>
IOS解析XML
查看>>
Python3多线程爬取meizitu的图片
查看>>
树状数组及其他特别简单的扩展
查看>>
zookeeper适用场景:分布式锁实现
查看>>
110104_LC-Display(液晶显示屏)
查看>>