【字符串】模式匹配:BF / KMP
2015-10-12 21:11
239 查看
字符串的模式匹配代码
public class KMP { /** * BF:穷举暴力 * @param s 文本串 * @param t 模式串 * @return 模式串在文本串中的位置 */ public static int BF(String s,String t) { int i = 0,j = 0; char[] ss = s.toCharArray(); char[] tt = t.toCharArray(); while(i < ss.length && j < tt.length) { if(ss[i] == tt[j]) { i++; j++; }else { i = i - j + 1; j = 0; } } if(j >= t.length()) return i - tt.length; else return -1; } /** * KMP算法 * @param s 文本串 * @param t 模式串 * @return 模式串在文本串中的位置 */ public static int KMPIndex(String s,String t) { int[] next = getNext(t); int i = 0,j = 0; char[] ss = s.toCharArray(); char[] tt = t.toCharArray(); while(i < ss.length && j < tt.length) { if(j == -1 || ss[i] == tt[j]) { i++; j++; }else { j = next[j]; } } if(j >= tt.length) return i - tt.length; else return -1; } /** * 计算模式串的next数组 * @param t 模式串 * @return 模式串的next数组 */ public static int[] getNext(String t) { int[] next = new int[t.length()]; int j = 0,k = -1; next[0] = -1; char[] tt = t.toCharArray(); while(j < tt.length - 1) { if(k == -1 || tt[j] == tt[k]) { j++; k++; next[j] = k; }else k = next[k]; } return next; } /** * 优化 * @param t * @return */ public static int[] getNext2(String t) { int[] next = new int[t.length()]; int j = 0,k = -1; next[0] = -1; char[] tt = t.toCharArray(); while(j < tt.length - 1) { if(k == -1 || tt[j] == tt[k]) { j++; k++; if(tt[j] == tt[k]) next[j] = next[k]; else next[j] = k; }else k = next[k]; } return next; } public static void main(String[] args) { System.out.println(BF("aababcd", "abc")); System.out.println(KMPIndex("aababcd", "abc")); } }
相关文章推荐
- 高德地图---天气搜索/逆向地理编码/定位
- SQLServer MySql 计数器表
- http://www.cnblogs.com/bluestorm/archive/2012/05/10/2493592.html
- 自定义导航控制器,统一设置Push的时候隐藏底部的tabbar
- android数据访问模式:档、SharedPreferences
- [LeetCode]题解(python):022-Generate Parentheses
- 【SQlite关系型数据库】SQLiteOpenHelper
- sql 取表的前10条记录,任意中间几行的记录
- 《王保明老师----Linux开发学习笔记》------讲03:进程
- 计算机视觉、机器学习相关领域论文和源代码大集合--持续更新……
- 设计模式之中介者模式
- 沙朗新闻发布系统汇总
- 第一章_servlet
- oracle之分组函数、数字函数、字符函数、转换函数和日期函数
- [转]python对json的相关操作
- [BZOJ4029][HEOI2015] 定价
- Android中自定义Adapter的基本原理
- 设计模式之-观察者模式
- 关于linux小知识
- BZOJ 3144: [Hnoi2013]切糕