KMP算法,字符串搜索

来源:互联网 发布:js流程图插件 编辑:程序博客网 时间:2024/05/20 06:51

相比于暴力方法,KMP算法进行字符串搜索时可以根据子串自己的特性,以确定当前是否匹配成功。简单来讲,就是使用了子串的每个字符的集合作为一个状态,创建一个有限状态机(DFA)。
比如要查找的子串为 ABABAC,那么对于每个位置的状态只有三个,即A、B、C,所以可以建立如下表格:

j 0 1 2 3 4 5 A B A B A C A 1 1 3 1 5 1 B 0 2 0 4 0 4 C 0 0 0 0 0 6

i 表示现在文本中的位置,j 表示子串的位置。上面的矩阵dfa[i][j] 即为子串第j个位置时,如果出现的字符为表的第i行对应的字符( A、B、C中的一个),那么它此时j应该跳转到的位置即为 dfa[i][j]。不管怎样,i 都只是增长而不回退。《算法》第四版的500页有清晰的图示,可以参考。下面的代码也是摘抄自此书。

package kmp;import java.util.Scanner;public class KMP {    private String pat;    private int[][] dfa;    public KMP(String pat) {        this.pat = pat;        int M = pat.length();        int R = 256;        dfa = new int[R][M];        dfa[pat.charAt(0)][0] = 1;        for (int X = 0, j = 1; j < M; ++j) {            for(int c = 0; c < R; ++c){                dfa[c][j] = dfa[c][X];            }            dfa[pat.charAt(j)][j] = j + 1;            X = dfa[pat.charAt(j)][X];        }    }    public int search(String txt){        int i, j, N = txt.length(), M = pat.length();        for(i = 0, j = 0; i < N && j < M; ++i){            j = dfa[txt.charAt(i)][j];        }        if(j == M) return i - M;        else return N;    }    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        String txt = scanner.nextLine();        String pat = scanner.nextLine();        scanner.close();        KMP kmp = new KMP(pat);        System.out.print("text:    ");        System.out.println(txt);        int offset = kmp.search(txt);        System.out.print("pattern: ");        for(int i = 0; i < offset; ++i)            System.out.print(" ");        System.out.println(pat);    }}
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 你家如果油锅起火时应该怎么办 当你遇到电器起火时应该怎么办 酷派大神f2充不进去电怎么办 借车子别人开违章一年了怎么办 快递刚发货我点错了收货怎么办 快递收货地址错了已经发货了怎么办 老公在外地工地上夜班吃不好怎么办 工人在工地干活被吊车撞了怎么办 小米手机记不得保密柜密码怎么办 华为手机文件保密柜密码忘了怎么办 超市寄存柜密码纸丢了怎么办 佳明软件安装不到手机上怎么办 最好的朋友的抢了自己的活怎么办 支付宝被实名验证上限了怎么办 装修预留插座被挡了一半怎么办 衣服放在柜子里面有味道怎么办 河北发货一个柜到天津港口怎么办 家用潜水泵更换电容后压力小怎么办 无塔供水井水水位低了怎么办 应急部成立林场的专业灭火队怎么办 路由器我恢复出厂设置断网了怎么办 多囊卵巢综合症不来月经怎么办 天刀普通血战苍梧城没有太白怎么办 天涯明月刀把沈妄言打入水中怎么办 天涯明月刀刷本队友技能太花怎么办 手机收所有短信时显示被隐藏怎么办 div放图片多出的空白怎么办 我14岁射精让我记忆力差了怎么办 qq闪退聊天记录全没了怎么办 木瓜奇迹忘记升级过头转职了怎么办 孩子进入青春期什么坏事都干怎么办 母狗狗第一次来月经应该怎么办图 社保断了想补缴怎么办?这些要知道 换工作社保断了一个月怎么办 北京社保中间断了几个月怎么办 农保和社保都交了医保怎么办 如果交了社保结婚生孩子断了怎么办 南京社保中间断了几个月怎么办 mu大师等级技能点加点太慢怎么办 永恒纪元戒不是本职业套装石怎么办 全民奇迹忘记在哪个区了怎么办