字符串匹配KMP算法
来源:互联网 发布:淘宝app看价格曲线 编辑:程序博客网 时间:2024/06/18 02:37
package Str.pipei;import java.util.Calendar;public class String_Kmp { public String_Kmp() { // TODO Auto-generated constructor stub } public static int[] getNext(String ps) { char[] p = ps.toCharArray(); int[] next = new int[p.length]; next[0] = -1; int j = 0; int k = -1; while (j < p.length - 1) { if (k == -1 || p[j] == p[k]) { next[++j] = ++k; } else { k = next[k]; } } return next; } /** * * 暴力破解法 * * @param srcText * 主串 * * @param ps * 模式串 * * @return 如果找到,返回在主串中第一个字符出现的下标,否则为-1 * */ public static int bf(String srcText, String ps) { char[] t = srcText.toCharArray(); char[] p = ps.toCharArray(); int i = 0; // 主串的位置 int j = 0; // 模式串的位置 // 匹配上的结果是j等于p.length while (i < (t.length) && j < p.length) { if (t[i] == p[j]) { // 当两个字符相同,就比较下一个 i++; j++; } else { i = i - j + 1; // 一旦不匹配,i后退 j = 0; // j归0 } } if (j == p.length) { return i - j; } else { return -1; } } public static int KMP(String ts, String ps) { char[] t = ts.toCharArray(); char[] p = ps.toCharArray(); int i = 0; // 主串的位置 int j = 0; // 模式串的位置 int[] next = getNext(ps); while (i < t.length && j < p.length) { if (j == -1 || t[i] == p[j]) { // 当j为-1时,要移动的是i,当然j也要归0 i++; j++; } else { // i不需要回溯了 // i = i - j + 1; j = next[j]; // j回到指定位置 } } if (j == p.length) { return i - j; } else { return -1; } } public static void main(String[] args) { // TODO Auto-generated method stub String_Kmp str = new String_Kmp(); System.out.println(Calendar.getInstance().getTime()); System.out.println(str.KMP("lsjflSJlasjflkjsalkjfa;lkjdflkajsldfj;assaflk;jdflkjas;ld" + "dlfkjsalkdjflska;jfksa;lkjfslak;jf;lsajfl;sakjflska;jlkfjdaljdkal;dkfja;skjdf" + "sadlkfjsladjkfljdflkjwoeijfwlekjwlkejrow" + "sldkfjlsakjflkjdflkasj;ldfkjasl;kfjsa;ldkfjal;sdfjl;askjflkajfklja;sfjkjwekjfsa;ld" + "Flsadkjflksaj;flkjd;lkjakdfjalskjdf" + "sadklfjslakjlk;dfjlaskjdflkjasd" + "saflksajflkjsa;lfkjasdfl;askjflk;asjflkjaslfkj;asldkfj;lsa" + "lfjsdlfkja;lkjfljeoijlskjf2465154651465s4f3as24f654fsad5f" + "asfsafasfasfsfsafdfsdfdfasLSJSJ;LSAJFLSJFLSJL;KJLSALJ SLDFJ" + "LSJFLKJSLDFJLJALKJFL;SAJLJsljflsjdfljsldj" + "sdjflkjsdlkjfljksd" + "sdl;kjflsjdf;jakfdlfj" + "sdkjflksjdlkfjsla;jfkjsalkjdflkajs;kfjoweijofiejroijofieuoifjweoiruoi3u4o3i2j4l2k3j" + "sadfasfsadfsafasdfajajslkdlk", "jfkjsalkjdflkajs;")); System.out.println(Calendar.getInstance().getTime()); System.out.println(Calendar.getInstance().getTime()); System.out.println(str.bf("lsjflSJlasjflkjsalkjfa;lkjdflkajsldfj;assaflk;jdflkjas;ld" + "dlfkjsalkdjflska;jfksa;lkjfslak;jf;lsajfl;sakjflska;jlkfjdaljdkal;dkfja;skjdf" + "sadlkfjsladjkfljdflkjwoeijfwlekjwlkejrow" + "sldkfjlsakjflkjdflkasj;ldfkjasl;kfjsa;ldkfjal;sdfjl;askjflkajfklja;sfjkjwekjfsa;ld" + "Flsadkjflksaj;flkjd;lkjakdfjalskjdf" + "sadklfjslakjlk;dfjlaskjdflkjasd" + "saflksajflkjsa;lfkjasdfl;askjflk;asjflkjaslfkj;asldkfj;lsa" + "lfjsdlfkja;lkjfljeoijlskjf2465154651465s4f3as24f654fsad5f" + "asfsafasfasfsfsafdfsdfdfasLSJSJ;LSAJFLSJFLSJL;KJLSALJ SLDFJ" + "LSJFLKJSLDFJLJALKJFL;SAJLJsljflsjdfljsldj" + "sdjflkjsdlkjfljksd" + "sdl;kjflsjdf;jakfdlfj" + "sdkjflksjdlkfjsla;jfkjsalkjdflkajs;kfjoweijofiejroijofieuoifjweoiruoi3u4o3i2j4l2k3j" + "sadfasfsadfsafasdfajajslkdlk", "jfkjsalkjdflkajs;")); System.out.println(Calendar.getInstance().getTime()); }}
输出结果看到用两种不同算法,暴力遍历以及KMP算法都是可以实现的。但是那么多字符在时间上好像没什么特别的差距。
0 0
- KMP 字符串匹配算法
- kmp字符串匹配算法
- kmp字符串匹配算法
- KMP字符串匹配算法
- 字符串匹配算法-kmp
- KMP(字符串匹配)算法
- KMP 字符串匹配算法
- 字符串匹配算法:KMP
- KMP算法 字符串匹配
- 字符串匹配 KMP 算法
- KMP字符串匹配算法
- KMP字符串匹配算法
- KMP算法:字符串匹配
- KMP字符串匹配算法
- 字符串匹配--KMP算法
- KMP字符串匹配算法
- KMP字符串匹配算法
- KMP字符串匹配算法
- 线性代数复习 第一章 行列式
- C++作业6
- jQuery源码分析笔记一
- 实习第八天:surfaceView实现图片缩放拖动功能
- Hive2.0.0操作HBase 1.2.1报错解决
- 字符串匹配KMP算法
- 专题三 总结动态规划
- 实习第八天:在SurfaceView中照样使用Android—Tween Animation!
- [CSAPP笔记][第十一章网络编程]
- 一个好用的网络图片下载工具类ImageLoader (LruCache一级缓冲机制)
- String与StringBuffer字符串反转
- XenServer架构之高可用性概述
- 关于struts2中文件上传获取不到文件名的问题
- 求素数