• KMP(Knuth–Morris–Pratt) Algorithm


    文章 String S, 要查找的字符串 String W

    重点:Get int T[] from W

    用变量 c 来表示当前比较到的 W 中前面的字符,
    i 表示当前要处理的 T 中的 index,
    int[] T = new int[W.length];
    T[0] = -1; T[1] = 0;
    c=0; i=2

    example:
    array:    a    b    a    b    c    d    a    b    a    b    a    b
    idx    :    0    1    2    3    4    5    6    7    8    9   10  11

    case 1:  W[c] == W[i-1] --> T[i] = ++c; i++;
    case 2:  W[c] != W[i-1] && c>0 --> c = T[c];
    case 3:  W[c] != W[i-1] && c==0 --> T[i] = 0; i++;

    过程
    array: a    b    a    b    c    d    a    b    a    b    a    b
    idx   : 0    1    2    3    4    5    6    7    8    9   10  11

    i: 2 3 4 5 5 6 7 8 9 10 11 11
    case: 3 1 1 2 3 3 1 1 1 1 2 1
    pre-c: 0 0 1 2 0 0 0 1 2 3 4 2
    after-c: 0 1 2 0 0 0 1 2 3 4 2 3
    比较: 0 & 0 0 & 2 1 & 3 2 & 4 0 & 4 0 & 5 0 & 6 1 & 7 2 & 8 3 & 9 4 & 10 2 & 10

    Related Problems: Implement strStr()Shortest Palindrome

    最后 po 一段自己写的 leetcode 上 implement strStr() 的代码

     1 public class Solution {
     2     public int strStr(String haystack, String needle) {
     3         if (needle == null || needle.length() == 0) return 0;
     4         
     5         int ndlen = needle.length();
     6         int hslen = haystack.length();
     7         
     8         if (ndlen == 1) {
     9             // only need to find the character in heystack
    10             return strChar(haystack, needle.charAt(0));
    11         }
    12         
    13         int[] table = buildKMPTable(needle);
    14         
    15         // KMP algorithm based on helper table
    16         int ndidx = 0, hsidx = 0;
    17         while (hsidx < hslen) {
    18             if (haystack.charAt(hsidx) == needle.charAt(ndidx)) {
    19                 hsidx++;
    20                 ndidx++;
    21                 if (ndidx == ndlen) return hsidx - ndlen;
    22             } else if (table[ndidx] != -1) {
    23                 ndidx = table[ndidx];
    24             } else {
    25                 hsidx++;
    26             }
    27         }
    28         return -1;
    29     }
    30     
    31     private int strChar(String str, char c) {
    32         if (str == null || str.length() == 0) return -1;
    33         for (int i = 0; i < str.length(); i++) {
    34             if (str.charAt(i) == c) return i;
    35         }
    36         return -1;
    37     }
    38     
    39     /* KMP table[i] contain the idx position that 
    40      * when str[j] != word[i], compare str[j] & word[table[i]]
    41      */
    42     private int[] buildKMPTable(String needle) {
    43         int[] table = new int[needle.length()];
    44         
    45         // needle.length() > 1
    46         table[0] = -1;
    47         table[1] = 0;
    48         int idx = 0;
    49         int i = 2;
    50         while(i < needle.length())  {
    51             char pre = needle.charAt(idx);
    52             char cur = needle.charAt(i - 1);
    53             if (pre == cur) { // case 1. word[idx] == word[i-1] 
    54                 table[i++] = ++idx;
    55             } else {
    56                 if (idx == 0) { // case 2. word[idx] != word[i-1] && idx == 0
    57                     table[i++] = 0;
    58                 } else { // case 3. word[idx] != word[i-1] && idx > 0
    59                     idx = table[idx];
    60                 }
    61             }
    62         }
    63         return table;
    64     }
    65 }
  • 相关阅读:
    SQLAlchemy
    Redis
    Django框架详解
    nginx负载均衡(反向代理)
    Python 字典 fromkeys()方法
    docker容器的使用
    keepalived原理
    学习区块链必读的6本书
    MATLAB基础入门笔记
    思念是一种美丽的孤独
  • 原文地址:https://www.cnblogs.com/joycelee/p/4457272.html
Copyright © 2020-2023  润新知