KMP演算法部分匹配值計算-Java實現
阿新 • • 發佈:2018-12-07
假設需要使用KMP演算法來尋找在某一段字串中是否出現"ABCDABD"這個字串,那麼KMP演算法最終要的一環就是計算該字串的部分匹配值。
首先文字分析該字串的部分匹配之的含義:
- 1,P[0]表示“A”,其完全前後綴都是空,所以其部分匹配值為0
- 2,P[1]表示“AB”,其完全字首為{空,A},完全字尾為{B,空},前後綴中只有空相同,所以AB(即P[1])的匹配值為0
- 3,P[2]表示“ABC”,其完全字首為{空,A,AB},完全字尾為{BC,B,空},前後綴中只有空相同,所以ABC(即P[2])的匹配值為0
- 4,P[3]表示“ABCD”,其完全字首為{空,A,AB,ABC},完全字尾為{BCD,CD,D,空},前後綴中只有空相同,所以ABCD(即P[3])的匹配值為0
- 5,P[4]表示“ABCDA”,其完全字首為{空,A,AB,ABC,ABCD},完全字尾為{BCDA,CDA,DA,A,空},前後綴中都有{A}長度為1,所以ABCDA(即P[4])的匹配值為1
- 6,P[5]表示“ABCDAB”其完全字首為{空,A,AB,ABC,ABCD,ABCDA},完全字尾為{BCDAB,CDAB,DAB,AB,B,空},前後綴中都有{AB}長度為2,所以ABCDAB(即P[5])的匹配值為2
- 7,P[6]表示“ABCDABD”其完全字首為{空,A,AB,ABC,ABCD,ABCDA,ABCDAB},完全字尾為{BCDABD,CDABD,DABD,ABD,BD,D,空},前後綴中只有空相同,所以ABCDABD(即P[6])的匹配值為0
import java.util.Scanner; public class KMP_pipei { public static void main(String[] args) { Scanner scan = new Scanner(System.in); while(scan.hasNext()){ String A = scan.nextLine(); //記錄字串的匹配值機對應的字串 String jilu[][] = new String[A.length()][2]; for(int i = 0;i<A.length();i++){ String B = A.substring(0, i+1); int changdu = chkRotation(B, B.length()); String sub = B.substring(0, changdu); jilu[i][0] = B; jilu[i][1] = String.valueOf(changdu); System.out.printf("%s的匹配值為%s\n",jilu[i][0],jilu[i][1]); } } } //計算字元的匹配 public static int chkRotation(String A, int lena) { String Abefore[] = new String[lena-1]; String Aafter[] = new String[lena-1]; int k=0; int value = 0; //計算部分匹配值,存放字首 for(int i=0;i1;i--){ Aafter[lena-i] = A.substring(lena-i+1,lena); } //迴圈比較找出構建的陣列中相同的字元段 while(k<lena-1){ if(Abefore[k].equals(Aafter[lena-k-2])){ value = Abefore[k].length(); } k++; } return value; } }