標籤:資料結構 kmp模式比對 串結構 java實現kmp
串(string)是由零個或多個宇符組成的有限序列,又名叫字串。
定義的解釋:
??串中的字元數目n稱為串的長度,定義中談到“有限”是指長度n是一個有限的數值。
??零個字元的串稱為空白串(null string),它的長度為零,可以直接用兩雙引號一表示,也可以用希臘Φ字母來表示。
??所謂的序列,說明串的相鄰字元之間具有前驅和後繼的關係。
下面是串的一些概念性東西:
??空格串,是只包含空格的串。注意它與空串的區別,空格串是有內容有長度的,而且可以不止一個空格。
??子串與主串,串中任意個數的連續字元組成的子序列稱為該串的子串,相應地,包含子串的串稱為主串。子串在主串中的位置就是子串的第一個字元在主串中的序號。
??串的比較是通過組成串的字元之間的編碼來進行的,而字元的編碼指的是字元在對應字元集中的序號。比較兩個串是否相等,必須是它們串的長度以及它們各個對應位置的字元都相等時,才算是相等。
串與線性表的比較:
??兩者的邏輯結構比較相似,不同的是串針對的是字元集(即串中的元素都是字元)。
??線性表更關注的是單個元素的操作,比如査找一個元素,插入或刪除一個元素,但串中更多的是査找子串位置、得到指定位置子串、替換子串等操作。
??串的順序儲存結構是用一組地址連續的儲存單元來儲存串中的字元序列的。按照預定義的大小,為每個定義的串變數分配一個固定長度的儲存區。一般是用定長數組來定義。
注意:
??串的串連操作,需要注意串長問題,可能遇到的問題就是兩個串聯接後會不會溢出,所以需要進行截斷操作。
尋找子串在主串中的位置,操作如下:
?1. 設i用於主串s1中當前位置下標值,j用於子串sub中當前位置下標值。
?2. 首先我們比較s1[1]與sub[1],如果相同的話,可能子串就開始了。
?3. 如果不相等,那麼子串仍然是從sub[1]開始,而主串s1則以s1[2]與其比較。
?4. 如果連續出現子串長度次或以上匹配,那麼就找到子串了,此時的j必然大於子串長度sub[0]。
KMP模式比對演算法:
??這個東西有些難懂,下面是我的學習的時候的一些經驗,希望對大家有所協助。
KMP模式比對演算法,不懂的話建議去魚C看視頻:http://study.163.com/course/courseMain.htm?courseId=468002,講的很不錯,很詳細;
然後對於前尾碼視頻裡面講的還不是很詳細清楚,不好理解的話可以去看阮一峰的這篇文章http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
還有兩篇KMP推薦:
從頭到尾徹底理解KMP(2014年8月22日版) - 結構之法 演算法之道 - 部落格頻道 - CSDN.NET
http://blog.csdn.net/v_july_v/article/details/7041827
KMP演算法學習初步 | 海虹不老閣——遙望北方的狼
http://haihongblog.com/archives/911.html
下面是我的Java實現版本:
package com.phn.string;import java.util.Arrays;/** * @author 潘海南 * @Email [email protected] * @TODO 模式比對演算法 * @date 2015年7月26日 */public class FOKMP { private static int[] getNext(String Str) { int[] next = new int[Str.length()]; int i, j; i = 0; j = -1; next[0] = -1; while (i < Str.length() - 1) { if (j == -1 || Str.charAt(i) == Str.charAt(j)) { i++; j++; if (Str.charAt(i) != Str.charAt(j)) { next[i] = j; } else { next[i] = next[j]; } } else { j = next[j]; } } return next; } public static int indexKMP(String S, String T) { int i = 0; int j = 0; int[] next = getNext(T); System.out.println(Arrays.toString(next)); while (i <= S.length() - 1 && j <= T.length() - 1) { if (j == -1 || S.charAt(i) == T.charAt(j)) { i++; j++; } else { j = next[j]; } } if (j >= T.length()) return i - T.length(); return -1; }}
著作權聲明:本文為博主原創文章,如需轉載請註明出處並附上連結,謝謝。
Java資料結構-串及其應用-KMP模式比對演算法