日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

字符串匹配算法 -- BM(Boyer-Moore) 和 KMP(Knuth-Morris-Pratt)详细设计及实现

發布時間:2023/11/27 生活经验 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符串匹配算法 -- BM(Boyer-Moore) 和 KMP(Knuth-Morris-Pratt)详细设计及实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 算法背景
    • 2. BM(Boyer-Moore)算法
      • 2.1 壞字符規則(bad character rule)
      • 2.2 好后綴規則(good suffix shift)
      • 2.3 復雜度及完整代碼
    • 3. KMP(Knuth Morris Pratt)算法
      • 3.1 好前綴 和 壞字符規則
      • 3.2 高效構建 失效函數
      • 3.3 復雜度及完整代碼
    • 4. 總結


1. 算法背景

文本編輯器/搜索引擎 隨著處理的數據量的不斷增加,對字符串匹配的效率要求越來越高,字符串匹配的效率也在不斷演進。

傳統的字符串匹配算法:BF(Brute Force) 和 RK(Rabin Karp) 算法 都消耗大量的時間。其中BF 比較粗暴,會將主串中的每一個字符都和模式串進行比較。RK在其基礎上做了優化,雖然不再一個一個字符比較,而是從主串中構建模式串長度的子串hash,從而達到高效的hash比較,但是構建每個子串的hash值的過程同樣需要取m-n+1個子串,并且對其計算hash,代價同樣巨大。

以上兩種字符串匹配算法滿足不了我們在大數據量下文本編輯器的查找性能(vim / less / more 的內容查找),對字符串匹配高效性能的需求 促進了BM/KMP這樣的高效匹配算法的出現。核心匹實現 還是說 每一次發現主串和模式串不匹配的字符之后,盡可能在主串中移動多個一定不會匹配的字符。

當然,目前BF,RK,BM,KMP 這樣的算法能夠在單模式串之間完成匹配,也就一個主串,一個模式串之間的匹配。對于 文本編輯器,像VIM這樣的 還需要有多模式串之間的高性能匹配需求,也就是一個主串多個模式串之間的匹配。所以,Trie樹這樣的數據結構 以及 AC 自動機這樣的高效算法 應運而生,并且他們被廣泛應用在了搜索引擎之中。

本篇將帶你欣賞 高效的單模式串匹配算法 BMKMP

2. BM(Boyer-Moore)算法

像背景中介紹的BF/RK 算法,核心還是對主串中的一個一個字符進行匹配,如下圖,如果第一次匹配到c發現模式串對應下標為d不匹配了,則會回到主串的第二個字符作為重新開始匹配的起始字符。

更加高效的匹配方式應該是跳過一定不會匹配的字符,比如上圖中主串的bc ,直接將主串的起始匹配字符向后移動到a開始進行匹配,這樣能夠有效減少匹配次數。

所以BM算法是為了找到能夠保證不會漏過匹配可能性的情況下 高效移動的規律。

主要就是兩種規則:

  • 壞字符
  • 好后綴

2.1 壞字符規則(bad character rule)

一般情況下,我們完成字符串匹配的過程是從左向右進行匹配的,比較符合我們的思維習慣,而壞字符規則 是反向 從右向左進行匹配。

先匹配最右邊的字符,發現主串c和模式串d不匹配,則認為c是壞字符,接下來模式串的移動將向后滑動三位,移動到壞字符之后。仍然從右向左進行匹配,發現主串中的a和模式串的d不匹配。

接下來的移動則不能直接移動到壞字符之后,因為模式串中也有一個a,如果我們直接移動到主串壞字符之后,就錯過了匹配, 應該將模式串向后滑動兩位,如下:

所以壞字符規則下的算法移動方式如下:

  1. 從右向左匹配模式串和主串,發現壞字符 ch時記錄 此時對應模式串的下標 Si
  2. 檢測模式串中是否有ch,有的話將其下標記錄Xi,否則記錄Xi = -1
  3. 移動時 直接移動 Si - Xi的長度

比如上圖 的算法移動方式如下:

  • 第一次發現壞字符時 Si=2;Xi=-1,則直接將模式串滑動Si-Xi=3
  • 第二次發現壞字符時Si=2;,因為模式串存在字符a,所以Xi=0,最后移動Si-Xi=2
  • 第三次 Match

實現代碼:

  • generateBC 函數會預先記錄模式串中每一個字符的index,如果有兩個一樣的字符,將后一個字符的下標作為index(防止匹配漏掉)
  • bm_alg 函數中先從右向左,發現不匹配的字符,記錄該字符對應的模式串下標; 從mp中取壞字符在模式串中存在的index,相減即可。
// storage the des's position
//
// @params:
// des: destination string
// mp: update the relationship between char in 
// des with it's index in des
//
// examples:
// s t r _ e x a m p l e
// 0 1 2 3 4 5 6 7 8 9 10
//
// mp['s'] = 0
// ...
// mp['e'] = 10
// ....
void generateBC(string des, map<char ,int> &mp) {int i;for(i = 0;i < des.size(); i ++) {// and the map relationship between des's// element with it's positionmp[des[i]] = i; }
} int bm_alg(string src, string des) {map<char ,int> last_pos;generateBC(des, last_pos);int i=0;int src_len = src.size();int des_len = des.size();while (i <= (src_len - des_len)) {int j;// find the bad charfor (j = des_len - 1; j >= 0; j--) {if (src[i+j] != des[j]) {break;}}if (j < 0) {return i;}// bad char's move positionint x = j - last_pos[src[i+j]];// move the max of position between badchari = i + x;}return -1;
} 

壞字符實現的最好時間復雜度能夠達到O(n/m),尤其是主串和模式串有類似特點的場景:aaabaaabaaabaaabaaaa 這種情況下的匹配時十分高效的。

但是壞字符并不能處理所有的匹配情況,比如aaaaaaaaaaaaabaaa這種情況,使用壞字符規則 下的滑動位置會變成負數(Si=0,Xi=3,滑動-3,顯然不合理),所以BM算法還需要好后綴規則。

2.2 好后綴規則(good suffix shift)

當我們從右往左遍歷模式串時找到壞字符時,前面已經相同的部分表示好后綴。

通過好后綴方式移動的算法有兩種:

  • 如果好后綴在模式子串v 中的另一個位置還存在v’,則將模式子串的v’ 和主串的好后綴對齊。
  • 如果好后綴不存在于模式串中的其他位置,則判斷好后綴的后綴子串 是否包含在模式串的前綴子串中;包含,則移動模式串 使后綴子串和匹配的前綴子串對齊;否則,按照壞字符規則移動。

對于第一種算法,移動方式如下:

找到好后綴在模式串的起始下標Si,以及另一個在模式串中匹配的好后綴的起始下標Xi,最終移動Si - Xi。

為什么會有第二種判斷好后綴的后綴子串的過程呢?如下匹配:

但實際上,這種情況已經過度滑動了,按照第一種移動方式會錯過正確的結果。

第二種辦法是取好后綴的后綴子串,判斷其是否能夠和模式串的前綴子串匹配,匹配則移動到兩個子串相匹配的位置。

后綴子串表示最后一個字符相同,前綴子串表示第一個字符相同;比如:abcd的后綴子串為 d,cd,bcd;對應的前綴子串為 a,ab,abc。這兩個指標是固定的,且能夠在開始匹配前快速初始化模式串的所有后綴子串和前綴子串 ,已經其是否匹配。

構建過程如下:

  • suffix 數組下標表示 后綴子串的長度,值表示后綴子串在模式串中匹配的另一個子串的起始位置。比如suffix[1]=2,后綴子串b長度為1,模式串中還有另一個b,則2表示這個b的其實下標。
  • Prefix 數組 的bool值表示這個后綴子串是否和前綴子串匹配。

構建兩個數組的代碼如下:

// generate suffix and prefix arr
//
// @params:
// des: destination str
// suffix: the first position of the suffix str in des
// prefix: if the suffix exist in prefix of des, update 
// prefix arr vector<bool> to true
//
// examples:
// des: b a b c a b
// pos: 0 1 2 3 4 5
// suffix: b, ab, cab, bcab, abcab
// suffix[1] = 0
// suffix[2] = 1
// suffix[3] = -1
// suffix[4] = -1
// suffix[5] = -1
//
// prefix[1] = true
// prefix[2] = true
// prefix[3] = false
// ...
void generateGS(string des, vector<int> &suffix,vector<bool> &prefix) {int i;int des_len = des.size();for (i = 0;i < des_len; i++) {suffix.push_back(-1);prefix.push_back(false);}// traverse the prefix str , update the suffix vector // and prefix vectorfor (i =0; i< des_len - 1; i++) {int j = i; // prefix start indexint k = 0;while(j >= 0 && des[j] == des[des_len - 1 -k]) {--j;++k;suffix[k] = j + 1;}if (j == -1) {prefix[k] = true;}}
}

完整好后綴的匹配規則 整體以盡可能短得方式移動:

  1. 判斷好后綴u是否包含在模式串中的其他位置u’, 移動到u’的起始位置,結束。
  2. 判斷好后綴的后綴子串v 是否包含在模式串的其他位置v’,并且和前綴子串匹配,則移動到前綴子串的起始位置,結束。
  3. 移動模式串長度 m 個位置,結束。

移動代碼如下:

// move the des str to a position
//
// @params:
// j: bad char's index
// des: destination string
// suffix: suffix in des's start index
// prefix: wether the suffix math with prefix
//
// case: 
// src: a b c a c a b c b c b a c a b c
// des: c b a c a b c
int movePosition(int j, string des, vector<int> suffix, vector<bool> prefix) {// case1: move to the longest len of sufix// 'k' is the good suffix's start index// 'j' is the bad char's indexint k = des.size() - 1 - j;if (suffix[k] != -1) {return j - suffix[k] + 1;}// case2: move to other suffix position//// longest suffix's range [j+1, len(des)-1]// other suffix's range [j+2, len(des)-1]for (int r = j + 2; r <= des.size() - 1; r++) {if (prefix[des.size() - r] == true) {return r;}}// case3: move the len of desreturn des.size();
}

在好后綴的移動規則和壞字符的移動規則之間取最大的移動位置來移動即可(好后綴的移動是普遍大于壞字符的移動方式),也就是好后綴的規則可以單獨使用。

2.3 復雜度及完整代碼

  • 空間復雜度:使用額外的兩個vector和一個map來保存中間數據。其大小與模式串的長度m有關。
  • 時間復雜度:
    1. A new proof of the linearity of the Boyer-Moore string searching algorithm 證明最壞場景上限為O(5n)
    2. Tight bounds on the complexity of the Boyer-Moore string matching algorithm 證明最壞場景上限為O(3n)

source_code: https://github.com/BaronStack/DATA_STRUCTURE/blob/master/string/bm_alg.cc

完整代碼實現如下:

#include <iostream>
#include <map>
#include <string>
#include <vector>#define MAP_SIZE 256using namespace std;// storage the des's position
//
// @params:
// des: destination string
// mp: update the relationship between char in 
// des with it's index in des
//
// examples:
// s t r _ e x a m p l e
// 0 1 2 3 4 5 6 7 8 9 10
//
// mp['s'] = 0
// ...
// mp['e'] = 10
// ....
void generateBC(string des, map<char ,int> &mp) {int i;for(i = 0;i < des.size(); i ++) {// and the map relationship between des's// element with it's positionmp[des[i]] = i; }
} // generate suffix and prefix arr
//
// @params:
// des: destination str
// suffix: the first position of the suffix str in des
// prefix: if the suffix exist in prefix of des, update 
// prefix arr vector<bool> to true
//
// examples:
// des: b a b c a b
// pos: 0 1 2 3 4 5
// suffix: b, ab, cab, bcab, abcab
// suffix[1] = 0
// suffix[2] = 1
// suffix[3] = -1
// suffix[4] = -1
// suffix[5] = -1
//
// prefix[1] = true
// prefix[2] = true
// prefix[3] = false
// ...
void generateGS(string des, vector<int> &suffix,vector<bool> &prefix) {int i;int des_len = des.size();for (i = 0;i < des_len; i++) {suffix.push_back(-1);prefix.push_back(false);}// traverse the prefix str , update the suffix vector // and prefix vectorfor (i =0; i< des_len - 1; i++) {int j = i; // prefix start indexint k = 0;while(j >= 0 && des[j] == des[des_len - 1 -k]) {--j;++k;suffix[k] = j + 1;}if (j == -1) {prefix[k] = true;}}
}// move the des str to a position
//
// @params:
// j: bad char's index
// des: destination string
// suffix: suffix in des's start index
// prefix: wether the suffix math with prefix
//
// case: 
// src: a b c a c a b c b c b a c a b c
// des: c b a c a b c
int movePosition(int j, string des, vector<int> suffix, vector<bool> prefix) {// case1: move to the longest len of sufixint k = des.size() - 1 - j;if (suffix[k] != -1) {return j - suffix[k] + 1;}// case2: move to other suffix position//// longest suffix's range [j+1, len(des)-1]// other suffix's range [j+2, len(des)-1]for (int r = j + 2; r <= des.size() - 1; r++) {if (prefix[des.size() - r] == true) {return r;}}// case3: move the len of desreturn des.size();
}// boyer-moore algorithm 
//
// two rules:
// 1. bad char 
// 2. good suffix
int bm_alg(string src, string des) {if (src.size() == 0 || des.size() == 0) {return -1;}map<char ,int> last_pos;vector<int> suffix;vector<bool> prefix;generateBC(des, last_pos);generateGS(des, suffix, prefix);int i=0;int src_len = src.size();int des_len = des.size();while (i <= (src_len - des_len)) {int j;// find the bad charfor (j = des_len - 1; j >= 0; j--) {if (src[i+j] != des[j]) {break;}}if (j < 0) {return i;}// bad char's move positionint x = j - last_pos[src[i+j]];int y = 0;// good suffix's move positionif (j < des_len - 1) {y = movePosition(j, des, suffix, prefix);}// move the max of position between badchar and // good suffixi = i + std::max(x,y);}return -1;
} int main() {string src;string des;cout << "input src ";cin >> src;cout << "input des ";cin >> des;if (bm_alg(src, des) != -1) {printf("%s is the substr of %s with index : %d\n",des.c_str(), src.c_str(), bm_alg(src,des));} else {printf("not match \n");}return 0;
}

3. KMP(Knuth Morris Pratt)算法

有了之前對BM算法的理解,接下來再看KMP算法就事半功倍了。

BM算法中通過 壞字符好后綴 規則 來約束模式串的滑動,兩個規則的結合能夠高效得檢索模式串是否和主串匹配。KMP算法相比于BM算法 都希望加速模式串的滑動,提升匹配效率。不同的是KMP將好后綴規則變成了好前綴規則。

如上圖,將模式串和主串中已經匹配的字符串稱為好前綴,不同的字符同樣是壞字符,就像BM算法的好后綴規則下,監測到好后綴的后綴子串在模式串中的其他位置,則向后滑動到這個匹配后綴子串的起始位置即可。同樣,KMP的好前綴中也希望滑動到匹配的后綴子串的位置(為了避免滑動過多,跳過匹配的情況,這里選擇最大匹配的后綴子串)。

3.1 好前綴 和 壞字符規則

如下圖,取好前綴的最大匹配后綴子串,其長度為k,將模式串匹配的前綴子串的結尾index移動 j-k個位置 即能夠和最大匹配后綴子串對齊,此事壞字符的位置i不用發生變化。

由上圖可知,KMP的滑動除了需要依賴主串找到壞字符之外, 其他的最大匹配前綴子串的計算并不需要主串的參與,僅僅通過模式串就能夠預先完成所有情況的最大匹配前綴子串的結尾下標計算。

也就是我們在KMP的算法規則中 只需要知道當出現壞字符時,模式串的最大可匹配前綴的下標即可,這樣就能夠完成模式串的移動了。這個最大可匹配下標的計算也就是KMP 常說的失效函數的計算,屬于KMP的核心計算過程了,我們將失效函數用next數組來表示。

基本的kmp代碼實現如下:

int kmp_alg(string src, string des) {if (src.size() == 0 || des.size() <= 0) {return -1;}int src_len = src.size();int des_len = des.size();vector<int> next;int i, j;next.resize(des_len);// Get the next vectorgetNext(des,next);for (i = 0;i < src_len; i++) {// 1. Find the bad char// 2. Next[j-1] is the longest match prefix's tail index//    move the j to the destinations.// // Example://                i//      0 1 2 3 4 5 6 7 8 9// src: a b a b a e a b a c// des: a b a b a c d //      0 1 2 3 4 5 6//                j//// when find bad char: i = 5, j = 5;// good prefix is : ababa// longest match prefix : aba// longest match prefix tail in des: 2// next[j-1] : next[5-1] = 2// j: 2 + 1 = 3//// after slide ,the src and des is bellow://                i//      0 1 2 3 4 5 6 7 8 9// src: a b a b a e a b a c// des:     a b a b a c d //          0 1 2 3 4 5 6//                j// while(j > 0 && src[i] != des[j]) {j = next[j-1] + 1; }// The good prefix, just add the jif (src[i] == des[j]) {j++;}// Match the des and return the index in srsif (j == des_len) {return (i - des_len + 1);}}return -1;
}

接下來看一下如何構建失效函數這一部分。

3.2 高效構建 失效函數

如下圖,左側的圖能夠非常直觀得看到 當發現了好前綴之后,如何找到其最大可匹配前綴的過程。

通過將好前綴的所有前綴子串和后綴子串列出來,找到其中最長一個能夠完成匹配的前綴子串,即是我們的最長可匹配前綴子串。這個尋找過程,我們也可以用來直接構造如右側圖的next數組(失效函數),也就是暴力法。

暴力法就是 **要對模式串中的每一個好前綴(m-1個)都要分別找出其后綴子串和前綴子串,并從中找到能夠匹配的最長的子串,**這個代價是極大的。

更優的辦法 是使用next[i-1] 來 嘗試構建next[i],理論上 next[i] 中肯定包含next[i-1],因為next[i]對應的好前綴是包含next[i-1]對應的好前綴的,這種方式理論上是可行的,需要關注的細節如下:

  1. case1: 假如next[i-1] = k-1,也就是子串des[0,k-1]是des[0,i-1]的最長可匹配前綴子串。如果des[0,k-1]的下一個字符des[k]和 des[0,i-1]的下一個字符des[i] 相等,則next[i] = next[i-1] + 1= k。

  2. case2: 如果des[0,k-1]的下一個字符des[k]和 des[0,i-1]的下一個字符des[i] 不相等,這個時候的處理稍微麻煩一些。

    也就是des[0,k-1]中無法滿足找到最長可匹配前綴子串,那么des[0,next[k-1]]的下一個字符能否滿足等于des[i]的要求呢,即des[next[k-1]]和des[i]是否相等,想等則認為des[0,next[k-1]] 是 des[0,i]的最長可匹配前綴子串,next[i] = next[k-1]+1 。

    整體上類似于數學的遞推公式:

    • 前一個的最長串des[0,k] 的下一個字符des[k+1]不與最后一個字符des[i]相等,則需要找前一個的次長串
    • 問題也就變成了求des[0, next[k]]的最長串:如果下一個字符des[next[k] + 1]還不和des[i]相等,那么繼續回溯到求des[0,next[next[k]]]的最長串,再判斷des[next[next[k]] + 1]和des[i]是否相等,相等則next[i] = next[next[k]] + 1
    • 否則繼續,依此直到找到 能夠和des[i]相等的字符。此時的next[next[…]]+1 就是next[i]的值。

    next數組的求值代碼如下:

    void getNext(string des, vector<int> &next) {next[0] = -1;int k = -1;int i;// i begin with 1, next[0] always is -1for (i = 1; i< des.size(); i++) {// Find the longest match prefix by judge // two char dex[i] and des[k+1].// Just like case1 and case2: next[i-1]=k-1// if des[i] == des[k-1], then next[i] = next[i-1] + 1 = k;while(k != -1 && des[i] != des[k+1]) {//let 'k' storage 'next[next[...]]'k = next[k];}// find the match char, let k ++if (des[i] == des[k+1]) {k++;}next[i] = k;}
    }
    

關于次長可匹配前綴和最長可匹配前綴之間的關系可以參考如下圖理解一下:
y = next[i-1] 其實就是上面代碼中的 k = next[k]的邏輯。

3.3 復雜度及完整代碼

KMP算法以難理解著稱,總體上就是一個回溯的過程,當前next[k]不滿足匹配子串[0,k]的下一個字符相等時,則回到next[next[k]]看看。

空間復雜度:維護一個 m(模式串長度)大小的數組。

時間復雜度:

  • 在next數組計算過程中,第一層for 循環[1,m-1],第二層的while循環中k=next[k]并不是每次都會執行,總的執行次數可以通過語句k++來判斷,并不會超過m次,畢竟next[k]的回溯過程一定會碰到-1的情況。所以next數據計算過程整體的時間復雜度是O(m) – while循環的執行次數小于m,且不穩定,可以當作常量來看。

  • 在外部主體進行匹配的過程中,外部循環[0,n-1],n表示主串的長度;因為j本身比i小, 所以while循環中 j=next[j-1]+1不可能循環n次,又因為next[j-1] 肯定小于j,相當于j之前的一個下標,也就是while中語句的執行次數是小于m的,也能夠看作一個常量。

    即外部匹配過程的時間復雜度是O(n)

所以總體的時間復雜度是O(m+n),當然相比于BM 的復雜度計算還不夠嚴謹,像O(5n)也是O(n)的范疇,這個就比BM算法消耗時間更久了。

source code:
https://github.com/BaronStack/DATA_STRUCTURE/blob/master/string/kmp_alg.cc

完整代碼如下:

#include <iostream>
#include <vector>
#include <string>using namespace std;void getNext(string des, vector<int> &next) {next[0] = -1;int k = -1;int i;// i begin with 1, next[0] always is -1for (i = 1; i< des.size(); i++) {// Find the longest match prefix by judge // two char dex[i] and des[k+1].// Just like case1 and case2: next[i-1]=k-1// if des[i] == des[k-1], then next[i] = next[i-1] + 1 = k;while(k != -1 && des[i] != des[k+1]) {//let 'k' storage 'next[next[...]]'k = next[k];}// find the match char, let k ++if (des[i] == des[k+1]) {k++;}next[i] = k;}
}int kmp_alg(string src, string des) {if (src.size() == 0 || des.size() <= 0) {return -1;}int src_len = src.size();int des_len = des.size();vector<int> next;int i, j;next.resize(des_len);// Get the next vectorgetNext(des,next);j = 0;for (i = 0;i < src_len; i++) {// 1. Find the bad char// 2. Next[j-1] is the longest match prefix's tail index// move the j to the destinations.// // Example://                i//      0 1 2 3 4 5 6 7 8 9// src: a b a b a e a b a c// des: a b a b a c d //      0 1 2 3 4 5 6//                j//// when find bad char: i = 5, j = 5;// good prefix is : ababa// longest match prefix : aba// longest match prefix tail in des: 2// next[j-1] : next[5-1] = 2// j: 2 + 1 = 3//// after slide ,the src and des is bellow://                i//      0 1 2 3 4 5 6 7 8 9// src: a b a b a e a b a c// des:     a b a b a c d //          0 1 2 3 4 5 6//                j//while(j > 0 && src[i] != des[j]) {j = next[j-1] + 1; }// The good prefix, just add the jif (src[i] == des[j]) {j++;}// Match the des and return the index in srsif (j == des_len) {return (i - des_len + 1);}}return -1;
}int main() {string s1,s2;cin >> s1;cin >> s2;if (kmp_alg(s1,s2) == -1) {cout << s1 << " with " << s2 << " not match !" << endl;} else {cout << s1 << " with " << s2 << " match !" << endl;}return 0;
}

4. 總結

本節僅僅描述的是高效的單模式串匹配算法,也能夠看到BM/KMP這樣的復雜算法的設計,還是比較難以理解,尤其是KMP中用到了一些動態規劃的思想。需要花費大量的時間和精力去思考實驗,才能了解清楚內部的詳細設計(從上周天開始研究,跟著極客時間的王爭老師理解,差點懷疑自己智力是不是有問題,最后還是下班路上想明白細節。。。還是得盡可能多得思考訓練,數據結構和算法功底決定未來技術壁壘的高度,尤其是現在搞的存儲引擎,分布式存儲/分布式數據庫領域的核心,更是一點不能馬虎),歡迎大家一起討論。

后續將會深入多模式串的數據結構Tire樹和算法AC自動機的設計,畢竟搜索引擎/文本編輯器中還是需要高效的多字符串的匹配才能滿足實際生產環境的需求。

總結

以上是生活随笔為你收集整理的字符串匹配算法 -- BM(Boyer-Moore) 和 KMP(Knuth-Morris-Pratt)详细设计及实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

99久久婷婷国产精品综合 | av片在线观看免费 | 超碰精品在线观看 | 免费看色的网站 | 精品网站999www | 91视频 - v11av | 欧美日韩网址 | 亚洲五月 | 亚洲综合五月天 | 日韩成人在线免费观看 | 日本成人黄色片 | 激情五月婷婷丁香 | 狠狠狠色狠狠色综合 | 亚洲在线成人精品 | 亚洲精品久久激情国产片 | 2021国产精品视频 | 天天干夜夜夜操天 | 国产最顶级的黄色片在线免费观看 | 国产精品嫩草在线 | 久久这里只精品 | 国产精品三级视频 | 久久草精品 | 日韩精品中文字幕有码 | 日韩二区在线观看 | 久久精品99精品国产香蕉 | 超碰人人做 | 日韩视频在线一区 | 欧美国产视频在线 | 五月天欧美精品 | 欧美精品久久久久久久亚洲调教 | 久久美女免费视频 | 久久久精品国产一区二区三区 | 一区二区不卡在线观看 | 日本不卡123区 | 日韩激情视频在线 | 激情五月综合 | 欧美一进一出抽搐大尺度视频 | 亚洲永久精品一区 | 三级大片网站 | 久久国产精品免费一区二区三区 | 色婷婷国产精品 | 黄色毛片视频 | 国产精品久久久久久久久蜜臀 | 亚洲精品日韩在线观看 | 久久夜色精品国产欧美一区麻豆 | 国产成年人av | 亚洲视频每日更新 | 男女啪啪免费网站 | 91精品高清 | 五月丁香 | 久久精品福利 | av丝袜美腿 | 成人高清在线观看 | 成人资源站 | 午夜精品三区 | 国产视频一区在线播放 | 又黄又爽又刺激的视频 | 午夜视频在线网站 | 国产精品21区 | 日韩精品专区 | 五月天色网站 | 国产丝袜一区二区三区 | 国产69精品久久久久久 | 久久婷婷五月综合色丁香 | 久久av网址 | 国产精品亚 | 最近2019好看的中文字幕免费 | 在线免费成人 | 亚洲高清91 | 欧美激情综合五月色丁香 | 少妇性xxx | 久久精品看 | 日日夜夜草| av大片网址 | 97电影院在线观看 | 亚洲精品永久免费视频 | 97视频在线免费 | 国产日韩精品在线观看 | 色噜噜日韩精品一区二区三区视频 | 亚洲精品国产精品国 | 亚洲精品久久视频 | 国产亚洲一区二区在线观看 | 亚洲综合网 | 免费黄色网址大全 | 色视频在线观看 | 久久视频这里有精品 | www.狠狠操| 久久69精品久久久久久久电影好 | 国产精品久久久久久久久免费 | 日本美女xx | 婷婷久久国产 | 婷婷六月激情 | 中文字幕黄色 | 欧美精品成人在线 | 国产91九色视频 | 日韩成人xxxx | 成 人 黄 色视频免费播放 | 国产成人av网址 | 免费网站观看www在线观看 | 3d黄动漫免费看 | 午夜在线观看一区 | 美腿丝袜av| 亚洲国产精品一区二区久久,亚洲午夜 | 日韩电影一区二区在线 | 五月婷婷综合激情 | 国产精品一区在线观看你懂的 | 国精产品一二三线999 | 精品亚洲午夜久久久久91 | 国产99久久久国产精品 | 亚洲美女在线国产 | 国产精品12 | 一区二区三区四区五区在线视频 | 国产成人一区二区三区在线观看 | 欧美日韩国产精品一区 | 草久在线视频 | 国产精品乱码一区二区视频 | 久久久精华网 | 亚洲在线视频观看 | 2019精品手机国产品在线 | www.色五月 | 看片网站黄| 久久久久精 | 精品一二三四在线 | 国产成人一区二区三区在线观看 | 日韩在线视频线视频免费网站 | 日韩av一区二区在线影视 | 伊人干综合 | www.五月天婷婷.com | 国产免费观看久久 | 亚洲干视频在线观看 | 欧美一级裸体视频 | 又黄又爽又刺激的视频 | 九九热在线观看视频 | 在线中文字幕网站 | 日韩久久精品一区二区 | 欧美日韩在线视频一区 | 国产精品一码二码三码在线 | 亚洲成人一区 | 成年人免费在线看 | 91视频在线观看下载 | 少妇视频在线播放 | 亚洲欧美成人在线 | 色小说av | 国产精品淫 | 少妇性bbb搡bbb爽爽爽欧美 | 亚洲精品国产成人av在线 | 国产色视频一区二区三区qq号 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲激情校园春色 | 色婷婷激情五月 | 91视频-88av| 国产精品成人免费一区久久羞羞 | 91漂亮少妇露脸在线播放 | 国产一区免费看 | 日韩av影视 | 婷婷五天天在线视频 | 热久久免费视频 | 久久精品视 | 日本久久免费电影 | 日日操日日插 | 天天爱天天舔 | av中文字幕网址 | 国内精品久久久久久中文字幕 | 狠狠操在线| 国产一区二区三区免费在线观看 | 亚洲午夜精品一区 | 国产福利小视频在线 | 欧美成人理伦片 | 亚洲视频一 | www91在线观看| 国产精品男女视频 | 国产精品理论片在线播放 | 久久小视频 | 在线亚州 | 欧美大片aaa | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 欧美日韩一区二区三区在线观看视频 | 粉嫩高清一区二区三区 | av网址最新 | 天天色天天爱天天射综合 | 精品国产一区二区三区男人吃奶 | 久久69av| 国产精品久久久 | 黄色一级在线免费观看 | 国产区欧美 | 国产群p | 国产视频中文字幕在线观看 | 日韩在线观看中文字幕 | 免费麻豆 | 精品在线视频观看 | 色视频在线看 | 亚洲欧洲精品一区二区 | 97精品国产一二三产区 | 五月亚洲综合 | 久草在线视频看看 | 国产精品一区久久久久 | 成人av播放 | 亚洲动漫在线观看 | 麻豆久久一区二区 | 九色视频网址 | 在线观看免费av网站 | 国产精品久久久久aaaa九色 | 四虎成人精品在永久免费 | 久草资源在线观看 | 中文字幕成人在线 | 女人高潮特级毛片 | 久草在线视频首页 | 91中文字幕在线视频 | av青草 | 特级西西www44高清大胆图片 | 91麻豆精品91久久久久同性 | 欧美乱码精品一区二区 | 日韩毛片在线免费观看 | aaawww| 欧美性生活一级片 | 欧洲精品久久久久毛片完整版 | 中文字幕在线播放日韩 | 久久综合九色综合97婷婷女人 | 国产婷婷精品av在线 | 五月婷婷色丁香 | 中文字幕一二三区 | 欧美精选一区二区三区 | 探花视频在线版播放免费观看 | 97色se| 99国产在线 | 欧美日韩亚洲一 | 日韩欧美一区视频 | 99激情网 | 91资源在线免费观看 | 在线观看av免费观看 | 嫩草91影院 | 欧美va在线观看 | 国产一区二区手机在线观看 | 亚洲精品视频在线观看免费视频 | 国产色视频123区 | 亚洲一区网 | 天天爱综合 | 一级做a爱片性色毛片www | 国产最新视频在线观看 | 色偷偷88888欧美精品久久 | 国产剧情一区二区在线观看 | 波多野结衣在线观看一区二区三区 | 成人精品一区二区三区电影免费 | 久久99爱视频| 97av超碰| 成人黄色中文字幕 | 99久高清在线观看视频99精品热在线观看视频 | 美女一区网站 | 日韩av手机在线看 | 成人av电影免费观看 | 久久一线 | 精品国产免费看 | 久久久影院一区二区三区 | 成年人免费看的视频 | 婷婷成人亚洲综合国产xv88 | 色视频网站免费观看 | 亚洲国产午夜 | 日本久久影视 | 精选久久| 亚洲一区免费在线 | 亚洲国产精品人久久电影 | 国产伦理剧 | 国产亚洲人成网站在线观看 | 97福利视频 | 色综合天天狠天天透天天伊人 | 国产精品综合久久 | 成人免费观看大片 | 91成品人影院 | 久久99国产一区二区三区 | 麻豆久久一区二区 | 黄色av网站在线观看免费 | 手机版av在线 | 国产精品123 | 探花视频在线观看免费版 | 亚洲乱亚洲乱妇 | 亚洲精品字幕 | 欧美精品你懂的 | 韩国精品一区二区三区六区色诱 | 国产精品视频在线看 | 中文字幕在线中文 | 激情久久网 | 日韩a级黄色片 | 久久99精品久久久久婷婷 | 精品一区二区三区久久久 | 毛片网在线播放 | 99re久久资源最新地址 | 中文字幕日本电影 | 久久人视频 | 国产99久久九九精品 | 国内精品久久久久久久97牛牛 | 日韩免费b | 一区二区三区 亚洲 | 三级av在线 | 欧美极品久久 | 久久精品视频播放 | 成人全视频免费观看在线看 | 综合色综合色 | 久久国产一区 | 亚洲少妇久久 | 欧美一二三区在线观看 | 激情久久一区二区三区 | 又紧又大又爽精品一区二区 | 国产不卡在线视频 | 久久精品国产99国产 | 视频在线在亚洲 | www国产精品com | 日本公妇色中文字幕 | 国产精品一区二区av | 日韩综合视频在线观看 | 久久一区二区三区国产精品 | 亚洲成人家庭影院 | 欧美日韩在线视频一区二区 | 久久看免费视频 | 国产精品综合久久久 | 国产精品2018| 成人免费看电影 | 国产精品成人一区二区三区吃奶 | 91av社区 | 国产一区二区三区高清播放 | 国产精品久久久久久久久久直播 | 四川bbb搡bbb爽爽视频 | 成人国产亚洲 | 色wwwww| 最新免费av在线 | 国产精品资源 | 国产99久久久精品 | www.超碰 | 国产精品免费人成网站 | 91精品久久久久 | 国产日产精品一区二区三区四区的观看方式 | 欧美粗又大 | 国产高清精| 97超在线 | 91麻豆精品国产午夜天堂 | 日韩免费精品 | 国产精品久久久久av免费 | 91精品第一页 | 国产精品入口久久 | 日本aaa在线观看 | 国产不卡精品 | 中文字幕在线观 | 精品久久久久久国产91 | 欧美日韩18 | 亚洲国产999| 97在线观| 探花视频免费观看高清视频 | 日日摸日日碰 | 黄网站免费看 | 丰满少妇对白在线偷拍 | 久久综合狠狠狠色97 | 久久综合狠狠综合久久综合88 | 九九综合九九 | 亚洲精品福利在线观看 | 国产xxxx做受性欧美88 | 婷婷精品 | av亚洲产国偷v产偷v自拍小说 | 久久精品99国产精品日本 | 久久91久久久久麻豆精品 | 日本中文字幕一二区观 | 国产精品久久久久久一区二区 | 字幕网在线观看 | 狠狠操综合网 | 婷婷日韩 | 视频一区二区在线 | 2022久久国产露脸精品国产 | 黄色大全在线观看 | 成+人+色综合| 久久最新 | 精品久久片 | 黄色aa久久 | 欧美日韩国产二区 | 午夜电影一区 | 中文字幕123区 | 97爱爱爱 | 久草爱视频 | 99久久99久久 | 精品在线一区二区三区 | 美女视频一区 | 麻豆精品视频在线观看免费 | 蜜桃久久久 | 不卡的一区二区三区 | 久热av| 国产原创av片 | 国产一级片不卡 | 亚洲免费激情 | 摸阴视频| 2022中文字幕在线观看 | 91av久久| 欧美精选一区二区三区 | 婷婷色中文网 | 国产在线无 | 六月色 | 在线观看中文字幕一区 | 五月开心婷婷网 | 2022中文字幕在线观看 | 亚洲最新视频在线播放 | 免费成人在线电影 | 久久影院午夜论 | 日日夜夜免费精品视频 | 日韩啪啪小视频 | 欧美91成人网 | 国产精品第52页 | 国产精品久久网 | 青草草在线视频 | 欧美一区二区精品在线 | 手机看片中文字幕 | 亚洲不卡在线 | 国产在线国偷精品产拍免费yy | 夜夜操综合网 | 亚洲日本欧美在线 | 在线色网站 | 免费精品在线观看 | 欧美精品中文 | 久草在线综合网 | 亚洲婷婷网 | www.五月婷婷.com | 一本—道久久a久久精品蜜桃 | 日韩久久电影 | 人人看黄色 | 99热九九这里只有精品10 | 亚洲天天看 | 久久亚洲福利视频 | 日日夜夜天天操 | 激情五月看片 | av中文字幕剧情 | 五月天六月丁香 | 天天曰天天曰 | 中文字幕超清在线免费 | 日躁夜躁狠狠躁2001 | 日韩黄色免费看 | 中文字幕视频一区 | 久久婷婷一区二区三区 | 在线视频 国产 日韩 | 在线观看黄色免费视频 | 久久亚洲免费视频 | 国产精品久久久久久婷婷天堂 | 中文字幕色婷婷在线视频 | 久久首页| 91传媒在线播放 | 亚洲综合在线播放 | 在线观看深夜视频 | 国产一区成人在线 | 日韩免费一区 | 中文av不卡| 日韩黄色在线电影 | 中文字幕综合在线 | 久久艹99| 国产精品久久久免费看 | 国产性天天综合网 | 成人免费看片98欧美 | 成人网页在线免费观看 | av福利免费| 青春草免费视频 | 美女免费视频网站 | 丝袜一区在线 | 黄色小说在线免费观看 | 欧美久草视频 | 九九久久精品 | www.99久久.com| av片中文字幕 | 中文字幕一区二区在线播放 | 成人性生爱a∨ | 亚洲高清av在线 | 黄色一级片视频 | 成人午夜片av在线看 | 亚洲综合导航 | 色综合色综合久久综合频道88 | 蜜臀久久99精品久久久无需会员 | 看片一区二区三区 | 国产品久精国精产拍 | 国产只有精品 | 国产色婷婷 | 美女性爽视频国产免费app | 99精品在这里| 亚洲精品综合一二三区在线观看 | 中文字幕日韩高清 | 成人av亚洲 | 亚洲精品小视频 | 国产黄色大片 | 免费看十八岁美女 | 欧美一区二区免费在线观看 | 国产日韩精品视频 | 久久精品99 | 99综合影院在线 | 欧美性极品xxxx娇小 | 日韩中文字幕亚洲一区二区va在线 | 黄色a一级视频 | 国产免费三级在线观看 | 精品国产一区二区三区久久 | 亚洲精品国产高清 | 黄色资源在线 | 91精品在线免费观看视频 | 色婷婷狠狠五月综合天色拍 | 9999国产| 欧美激情视频一区二区三区免费 | 日韩视频1 | 精品久久久久久综合日本 | 国产成人久久精品77777综合 | 日韩久久影院 | 久草久热 | 久久综合给合久久狠狠色 | 久久99久久99精品免观看粉嫩 | 天天爽网站| 精品综合久久久 | 天天射天天爱天天干 | 久草视频中文 | 在线日韩精品视频 | 免费91在线 | 亚洲一区二区精品 | 天海冀一区二区三区 | 狠狠色噜噜狠狠狠狠2021天天 | 亚洲人精品午夜 | 久久久精品福利视频 | 99久久这里有精品 | 国产一区在线免费 | 成人免费共享视频 | 久久国产精品久久w女人spa | 婷婷婷国产在线视频 | 97电影网手机版 | 美女国产免费 | 国产精品久久久久av免费 | 日韩免费在线 | av一级片在线观看 | 日韩成年视频 | 久久99亚洲网美利坚合众国 | 日日夜夜操操操操 | 天天操天天干天天爱 | 在线免费国产 | 一区二区三区 中文字幕 | av片子在线观看 | 欧美性黄网官网 | 美州a亚洲一视本频v色道 | 蜜桃视频日韩 | 欧美日韩高清在线一区 | 欧美在线99| 国产日韩精品欧美 | 欧美日韩中文国产一区发布 | 久久久久久久久久久影院 | 九色在线视频 | 在线影院 国内精品 | 国产亚洲视频在线免费观看 | 精品成人在线 | av观看在线观看 | 2020天天干夜夜爽 | 久久精品国产亚洲精品 | 午夜av一区 | 亚洲精品国产精品久久99 | 久久伦理 | 国产麻豆精品一区 | 久久精品99国产 | 高清av中文字幕 | 美女天天操| 成年人免费在线观看 | 精品不卡av | a在线观看免费视频 | 在线观看视频国产一区 | 久久久久久久久免费视频 | 午夜国产福利在线观看 | 男女免费视频观看 | 国产黄 | 国产精品一区二区电影 | 免费看黄色小说的网站 | 麻豆视频在线免费观看 | 亚洲在线视频免费观看 | 欧美日本高清视频 | 久久精品成人欧美大片古装 | 福利在线看片 | 黄色一级动作片 | 国产蜜臀av| 日韩欧美高清免费 | 免费看黄电影 | 狠狠色丁香婷婷综合基地 | 久久精品永久免费 | 91在线永久| 色午夜影院 | 最近的中文字幕大全免费版 | 国内精品久久久久久久久久久 | 欧美成人黄色 | 久草在线视频中文 | 亚洲成人av片在线观看 | 91成人免费视频 | 久久伊人八月婷婷综合激情 | 综合av在线| www看片网站 | 视频在线观看入口黄最新永久免费国产 | 成人小视频在线免费观看 | 亚洲精品xx | 久久久这里有精品 | 国产一级精品在线观看 | 999久久久国产精品 高清av免费观看 | 在线电影91 | 99久久影院 | 国产一级二级三级视频 | 久久天堂网站 | 色婷婷亚洲婷婷 | 特黄特黄的视频 | 国产精品夜夜夜一区二区三区尤 | 亚洲视频精选 | 久久国产精品99国产 | 二区三区在线 | 国产 日韩 欧美 在线 | 亚洲精品国产电影 | 亚洲综合在| 亚洲精品乱码久久 | 91精品一区二区三区蜜桃 | 香蕉蜜桃视频 | 精品在线看 | 中文字幕在线观看视频一区 | 看av在线 | 嫩模bbw搡bbbb搡bbbb | 日本三级香港三级人妇99 | 午夜婷婷在线观看 | 69xx视频| 亚洲国产精品久久久久婷婷884 | 国产精品高清免费在线观看 | 国内一级片在线观看 | 国产一级视频在线观看 | 久久精品小视频 | 又黄又爽又无遮挡免费的网站 | 久久久久国产精品视频 | 一区二区三区免费在线 | 91系列在线 | 五月天色站 | 九九久久成人 | 视频一区二区三区视频 | 亚洲国产经典视频 | 午夜影院一级片 | 成年美女黄网站色大片免费看 | 国产精品成人一区二区三区吃奶 | 日本激情动作片免费看 | www91在线观看 | 久久久国产成人 | 国产一区在线视频播放 | 日韩视频免费看 | www激情com | 欧美日韩精品在线 | h视频在线看| 欧美日韩另类在线观看 | 亚洲自拍自偷 | 99精品在线免费 | 激情丁香综合五月 | 伊人小视频 | 欧美日韩精品久久久 | 日狠狠 | 久久99网| 午夜在线观看影院 | 2019久久精品 | 国产精久久久 | 国产精品久久久久久一二三四五 | 欧美一级免费黄色片 | 99国产成+人+综合+亚洲 欧美 | 人人插人人爱 | 2023国产精品自产拍在线观看 | 久久久国产精品成人免费 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 狠狠躁18三区二区一区ai明星 | 97福利在线观看 | 免费的成人av | 久草| 国产精品免费久久久久久久久久中文 | 天天色天天操综合网 | 在线观看成人网 | 国产美腿白丝袜足在线av | 中文av网| 91社区国产高清 | a级国产毛片 | 麻豆一区在线观看 | 欧美 日韩 国产 中文字幕 | 欧美激情视频一区二区三区 | 亚洲人xxx | 成年人免费在线播放 | 国产一区二区三精品久久久无广告 | 国产91探花 | 伊人婷婷激情 | 久久久久国产精品www | 一区二区av | 久久国产剧场电影 | 欧美视频www | 在线看片中文字幕 | 玖玖精品视频 | 亚洲理论视频 | 天天夜夜狠狠操 | 色婷婷av一区二 | 91成人精品一区在线播放 | 亚洲一区二区三区四区在线视频 | 国产99久久久国产精品免费看 | 91桃色在线播放 | 三级动图 | 久久久wwww | 久久精品免费观看 | 久久综合五月 | 人人玩人人添人人澡超碰 | 蜜桃视频在线观看一区 | 黄色成人av网址 | 96精品高清视频在线观看软件特色 | 久久综合九色综合97婷婷女人 | 88av视频| 欧美久久九九 | 成人免费视频网 | 亚洲精品99久久久久久 | 99热这里只有精品在线观看 | 日本少妇高清做爰视频 | 婷婷国产视频 | 日韩欧美综合视频 | 蜜桃视频日韩 | 日本久久久精品视频 | 99热精品在线观看 | 色爽网站 | 制服丝袜在线 | 五月婷婷免费 | 精品久久久久久久久久久久久久久久 | 在线一二区 | 久久欧美在线电影 | 91精品国产高清 | 日韩在线观看第一页 | 91在线看视频免费 | 人人精品久久 | 国产午夜精品一区二区三区四区 | 精品综合久久 | 中文字幕成人网 | 亚洲精品久久久久久久不卡四虎 | 免费能看的黄色片 | 精品国产视频一区 | 亚洲精品乱码久久久久久写真 | 中文字幕在线免费看线人 | 日韩激情小视频 | 91精品91| 99久久久国产精品免费99 | 91成人免费观看视频 | 天天插天天操天天干 | 亚洲激情综合 | 91精品在线免费观看视频 | 黄色综合 | 亚洲高清视频在线观看 | 美女免费视频一区 | 国产三级国产精品国产专区50 | 成人h动漫精品一区二 | 中文字幕在线观看第二页 | 久久精品欧美日韩精品 | 成人免费观看网址 | 日韩精品在线观看av | 在线观看视频在线观看 | 在线电影中文字幕 | 婷婷色中文字幕 | 91久久丝袜国产露脸动漫 | 国产黄色电影 | 黄色免费网战 | 蜜臀一区二区三区精品免费视频 | 亚洲蜜桃在线 | 五月天色综合 | 日韩久久久久 | 久久久五月婷婷 | 九九电影在线 | 免费看黄在线看 | 91人人射 | 欧美一区日韩精品 | 久久tv视频 | 五月综合在线观看 | 免费特级黄毛片 | 色综合天天综合网国产成人网 | 娇妻呻吟一区二区三区 | 玖玖爱国产在线 | 国产一二三在线视频 | 日本不卡久久 | 婷婷精品在线视频 | 激情五月播播久久久精品 | 91亚洲精品国偷拍 | a在线观看免费视频 | 高清视频一区二区三区 | 99热这里有 | 国产人免费人成免费视频 | 国产精品一区二区av影院萌芽 | 精品av网站 | 免费在线观看一级片 | 国产超碰在线 | 亚洲无吗视频在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 伊人欧美 | 天天干天天干天天色 | 欧美在线视频第一页 | 午夜视频在线观看网站 | 久久久久免费精品视频 | 精品久久综合 | 色a4yy| 色综合久久88色综合天天6 | 久久久久久伊人 | 国产一区二区在线观看免费 | 亚洲影视资源 | 天天躁天天躁天天躁婷 | 久久精品电影院 | 亚洲国产精品小视频 | 亚洲成人av在线电影 | 免费在线观看av电影 | 免费特级黄毛片 | 国产精品免费成人 | 日韩一二区在线观看 | 免费黄色a网站 | 天天色天天色 | 亚洲 欧美 成人 | 97成人在线 | 久久久视频在线 | 丁香激情五月 | 日韩av女优视频 | 奇米影视8888| 国产精品久久久久久妇 | 超碰成人网| 成人黄色在线视频 | 久久国语露脸国产精品电影 | 中文av资源站 | 人人看黄色 | 日韩精品视频在线观看免费 | 69精品久久| 欧美成人999 | 日日夜夜骑 | 中中文字幕av在线 | 日韩高清成人在线 | 狠狠色丁香九九婷婷综合五月 | 日韩精品中文字幕一区二区 | 成人黄色小说网 | 久久久.com | 久久这里 | 亚洲成免费 | 视频在线精品 | 日本精品一区二区三区在线播放视频 | 狠狠久久综合 | 欧洲精品亚洲精品 | 五月婷婷影视 | 亚洲国产日韩精品 | 精品夜夜嗨av一区二区三区 | 国产精品乱码一区二区视频 | 国产精品视频999 | 日韩中文字幕亚洲一区二区va在线 | 欧美日韩网址 | 国产亚洲精品久久久久久网站 | 国产精品99久久久久人中文网介绍 | 97福利在线观看 | 在线观看中文字幕dvd播放 | 九九在线精品视频 | 少妇视频一区 | 免费看亚洲毛片 | 久久精品一区二区三区四区 | 国产九色视频在线观看 | 99久久精品免费看国产免费软件 | 日韩精品一区二区三区免费观看视频 | av.com在线| 激情网在线视频 | 97超碰色偷偷 | 久久99热这里只有精品 | 97香蕉久久国产在线观看 | 国产一二三区av | 黄色免费电影网站 | 国产免费激情久久 | 伊人五月天.com | 国产精品美女久久久久久 | 精品视频免费看 | 国产a视频免费观看 | 天天躁日日躁狠狠躁av麻豆 | 91精品视屏 | 欧美日韩国产一区二区三区在线观看 | 中文字幕在线观看一区二区 | 999久久久久久久久久久 | 91资源在线 | 国内小视频 | 午夜色性片 | 久久精品这里都是精品 | 夜夜躁狠狠躁日日躁视频黑人 | ,午夜性刺激免费看视频 | 欧美一级淫片videoshd | 热re99久久精品国产66热 | 亚洲极色 | 久久99久久99精品 | 成人在线观看资源 | 日本系列中文字幕 | 在线看小早川怜子av | 中文字幕乱偷在线 | 在线观看中文 | 亚洲91av| 久久99国产精品二区护士 | 成人一区不卡 | 国产黄av| 国产精品a成v人在线播放 | 久久久精品在线观看 | 黄色小说视频在线 | 国产97在线观看 | 91网址在线 | 在线观看国产一区二区 | 日日夜夜精品免费视频 | 日韩毛片在线播放 | 超碰在线公开免费 | 高清免费在线视频 | 国产成人精品一区二区三区网站观看 | 成人av免费在线播放 | 日韩高清 一区 | 2019天天干天天色 | 精品亚洲欧美无人区乱码 | 99精品视频免费观看视频 | 超级碰碰免费视频 | 麻豆国产电影 | 日日干 天天干 | 天天碰天天操视频 | 久久66热这里只有精品 | 91精品国自产在线偷拍蜜桃 | 亚洲精品久久久久久久蜜桃 | 精品国产片 | 国产亚洲精品综合一区91 | 另类老妇性bbwbbw高清 | 免费看一级一片 | 丁香婷婷综合色啪 | 在线国产精品一区 | 伊人成人激情 | 国产在线最新 | 久久久久综合 | 91福利社区在线观看 | 亚洲影音先锋 | 久草www | 久久久久久久久久久网 | 久久久视频在线 | 亚洲 欧美 日韩 综合 | 丁香在线| 91亚洲国产成人 | 日韩精品视频免费在线观看 | 久久国产精品免费观看 | 2021国产精品视频 | 久久视奸| av一级网站 | 97超碰成人 | 国产在线精品播放 | 精品在线观| 91av在线免费播放 | 久久免费在线观看 | 亚洲综合小说电影qvod | 亚洲精品视频免费 | 久艹视频在线免费观看 | 亚洲精品美女 | 中文字幕一区二区三区视频 | 欧美激情第28页 | 黄色精品网站 | 日日操日日插 | 国产精品毛片网 | 99久久精品无码一区二区毛片 | 欧美少妇影院 | 草免费视频 | 亚洲精品国产精品国 | 精品三级av | 精品久久久久久亚洲综合网站 | 久久免费福利 | 999精品网 | 亚洲精品中文在线资源 | 精品免费 | 91精彩视频 | 亚洲国产一区在线观看 | 国产中文字幕视频在线观看 | 国产精华国产精品 | 久久久国产精品一区二区中文 | 欧美大片在线观看一区 | 超碰97人人在线 | 五月开心激情网 | 亚洲资源| 国产色秀视频 | 午夜免费久久看 | 午夜精品在线看 | 精品国产乱码久久久久久久 | 日韩精品一区二区三区三炮视频 | 中文资源在线播放 | 国产精品自产拍在线观看网站 | 精品久久久精品 | 国产成人精品日本亚洲999 | 欧美日韩久久一区 | 久久天天操 | 亚洲黄色在线免费观看 | 天海翼一区二区三区免费 | 国产欧美日韩精品一区二区免费 | 国产美女在线精品免费观看 | 狠狠天天 | av高清在线| 麻豆精品在线 | 久草在线最新 | 国产成人在线免费观看 | 亚洲高清激情 | 一级理论片在线观看 | 国产精品亚洲片夜色在线 | 国产呻吟在线 | 成人97视频一区二区 | 在线播放视频一区 | 久久资源总站 | 天天色图 | 日韩高清精品免费观看 | 麻豆视频免费在线观看 | 精品亚洲国产视频 | 欧美国产视频在线 | 一区二区av | av.com在线 | 激情婷婷色 | 激情久久小说 | 热re99久久精品国产99热 | 国产高清精品在线观看 | 色www.| 97在线资源 |