Java實現字符串匹配算法KMP
kmp算法的核心思想:先對搜索字串生成偏移對照表,匹配時從左向右依次比較(bm從右向左,號稱比kmp更快),相等則文檔和搜索字串的下標+1迭代, 否則查表,定位最優的偏移位置(文檔下標不變,搜索字串下標改變)。例外是,字符不匹配時,若搜索字串的下標為0,則文檔的下標+1,繼續迭代比較。
- 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=,
- key_iter=;
- 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);
- }
- }
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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!