《漫画算法2》源码整理-4 字符串匹配算法 RK KMP
生活随笔
收集整理的這篇文章主要介紹了
《漫画算法2》源码整理-4 字符串匹配算法 RK KMP
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
RK算法
public class RabinKarp {public static int rabinKarp(String str, String pattern) {//主串長(zhǎng)度int m = str.length();//模式串的長(zhǎng)度int n = pattern.length();//計(jì)算模式串的hash值int patternCode = hash(pattern);//計(jì)算主串當(dāng)中第一個(gè)和模式串等長(zhǎng)的子串hash值int strCode = hash(str.substring(0, n));//用模式串的hash值和主串的局部hash值比較。//如果匹配,則進(jìn)行精確比較;如果不匹配,計(jì)算主串中相鄰子串的hash值。for (int i = 0; i < (m - n + 1); i++) {if ((strCode == patternCode) && compareString(i, str, pattern)) {return i;}//如果不是最后一輪,更新主串從i到i+n的hash值if (i < (m - n)) {strCode = nextHash(str, strCode, i, n);}}return -1;}private static int hash(String str) {int hashcode = 0;//這里采用最簡(jiǎn)單的hashcode計(jì)算方式://把a(bǔ)當(dāng)做1,把b當(dāng)中2,把c當(dāng)中3.....然后按位相加for (int i = 0; i < str.length(); i++) {hashcode += (str.charAt(i) - 'a');}return hashcode;}private static int nextHash(String str, int hash, int index, int n) {hash -= (str.charAt(index) - 'a');hash += (str.charAt(index + n) - 'a');return hash;}private static boolean compareString(int i, String str, String pattern) {String strSub = str.substring(i, i + pattern.length());return strSub.equals(pattern);}public static void main(String[] args) {String str = "aacdesadsdfer";String pattern = "adsd";System.out.println("第一次出現(xiàn)的位置:" + rabinKarp(str, pattern));} }KMP算法
public class KMP {// KMP算法主體邏輯。str是主串,pattern是模式串public static int kmp(String str, String pattern) {//預(yù)處理,生成next數(shù)組int[] next = getNexts(pattern);int j = 0;//主循環(huán),遍歷主串字符for (int i = 0; i < str.length(); i++) {while ((j > 0) && (str.charAt(i) != pattern.charAt(j))) {//遇到壞字符時(shí),查詢next數(shù)組并改變模式串的起點(diǎn)j = next[j];}if (str.charAt(i) == pattern.charAt(j)) {j++;}if (j == pattern.length()) {//匹配成功,返回下標(biāo)return i - pattern.length() + 1;}}return -1;}// 生成Next數(shù)組private static int[] getNexts(String pattern) {int[] next = new int[pattern.length()];int j = 0;for (int i = 2; i < pattern.length(); i++) {while ((j != 0) && (pattern.charAt(j) != pattern.charAt(i - 1))) {//從next[i+1]的求解回溯到 next[j]j = next[j];}if (pattern.charAt(j) == pattern.charAt(i - 1)) {j++;}next[i] = j;}return next;}public static void main(String[] args) {String str = "ATGTGAGCTGGTGTGTGCFAA";String pattern = "GTGTGCF";int index = kmp(str, pattern);System.out.println("首次出現(xiàn)位置:" + index);} }總結(jié)
以上是生活随笔為你收集整理的《漫画算法2》源码整理-4 字符串匹配算法 RK KMP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《漫画算法2》源码整理-3 二分查找 跳
- 下一篇: 《漫画算法2》源码整理-5 二维数组螺旋