Java實現字符串匹配算法KMP

jopen 9年前發布 | 2K 次閱讀 Java 算法

kmp算法的核心思想:先對搜索字串生成偏移對照表,匹配時從左向右依次比較(bm從右向左,號稱比kmp更快),相等則文檔和搜索字串的下標+1迭代, 否則查表,定位最優的偏移位置(文檔下標不變,搜索字串下標改變)。例外是,字符不匹配時,若搜索字串的下標為0,則文檔的下標+1,繼續迭代比較。

  1. import java.util.Arrays;  
  2.   
  3. public class KMPSearch {  
  4.     public static int[] table;  
  5.     public static void generateTab(String key){//查詢字串生成偏移對照表,一次迭代就可以  
  6.         int len=key.length();  
  7.         table=new int[len];  
  8.         Arrays.fill(table, 0);  
  9.           
  10.         for(int i=1;i<len;i++){  
  11.             if(key.charAt(i)==key.charAt(table[i-1])){  
  12.                 table[i]=table[i-1]+1;  
  13.             }  
  14.         }  
  15.         for(int v : table){  
  16.             System.out.print(v);  
  17.         }  
  18.         System.out.println();  
  19.     }  
  20.     public static int KMPSearchs(String doc,String key){  
  21.         generateTab(key);  
  22.         int result=-1;  
  23.         int doc_size=doc.length(),  
  24.             key_size=key.length(),  
  25.             doc_iter=,  
  26.             key_iter=;  
  27.         while(doc_iter<doc_size){//遍歷所查詢的文檔,同樣,單層循環就可以實現→_→  
  28.             if(doc.charAt(doc_iter)==key.charAt(key_iter)){  
  29.                 doc_iter++;  
  30.                 key_iter++;  
  31.             }else{  
  32.                 if(key_iter==0){  
  33.                     doc_iter++;  
  34.                     continue;  
  35.                 }else{  
  36.                     key_iter=table[key_iter-1];  
  37.                     continue;  
  38.                 }  
  39.             }  
  40.             if(key_iter==key_size){  
  41.                 result=doc_iter-key_size;  
  42.                 break;  
  43.             }  
  44.         }  
  45.         return result;  
  46.     }  
  47.     public static void main(String[] args){  
  48.         int i=KMPSearchs("bbc abcdab abcdabcdabde","abcdabd");  
  49.         System.out.println(i);  
  50.     }  

    import java.util.Arrays;

public class KMPSearch {  
    public static int[] table;  
    public static void generateTab(String key){//查詢字串生成偏移對照表,一次迭代就可以  
        int len=key.length();  
        table=new int[len];  
        Arrays.fill(table, 0);  

        for(int i=1;i<len;i++){  
            if(key.charAt(i)==key.charAt(table[i-1])){  
                table[i]=table[i-1]+1;  
            }  
        }  
        for(int v : table){  
            System.out.print(v);  
        }  
        System.out.println();  
    }  
    public static int KMPSearchs(String doc,String key){  
        generateTab(key);  
        int result=-1;  
        int doc_size=doc.length(),  
            key_size=key.length(),  
            doc_iter=0,  
            key_iter=0;  
        while(doc_iter<doc_size){//遍歷所查詢的文檔,同樣,單層循環就可以實現→_→  
            if(doc.charAt(doc_iter)==key.charAt(key_iter)){  
                doc_iter++;  
                key_iter++;  
            }else{  
                if(key_iter==0){  
                    doc_iter++;  
                    continue;  
                }else{  
                    key_iter=table[key_iter-1];  
                    continue;  
                }  
            }  
            if(key_iter==key_size){  
                result=doc_iter-key_size;  
                break;  
            }  
        }  
        return result;  
    }  
    public static void main(String[] args){  
        int i=KMPSearchs("bbc abcdab abcdabcdabde","abcdabd");  
        System.out.println(i);  
    }  
}  </pre> 


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!