日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《漫画算法2》源码整理-4 字符串匹配算法 RK KMP

發(fā)布時(shí)間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《漫画算法2》源码整理-4 字符串匹配算法 RK KMP 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

RK算法

public class RabinKarp {public static int rabinKarp(String str, String pattern) {//主串長度int m = str.length();//模式串的長度int n = pattern.length();//計(jì)算模式串的hash值int patternCode = hash(pattern);//計(jì)算主串當(dāng)中第一個(gè)和模式串等長的子串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;//這里采用最簡單的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的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。