<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      字符串模式匹配(一)——單模匹配(KMP)

      字符串模式匹配(一)——單模匹配(KMP)

      單模匹配的常用算法為KMP,多模匹配常用算法為AC自動機。

      暴力匹配法(BF, O ( ∣ S ∣ × ∣ T ∣ ) O(|S|\times |T|) O(S×T))

      設(shè)源串 S S S的匹配指針為 i i i,模式串 T T T的匹配指針為 j j j。暴力法通過逐個比較 S S S T T T中的每個字符進行模式匹配。

      算法流程:循環(huán)執(zhí)行下列步驟,直到 i i i越界,匹配結(jié)束:

      • S [ i ] = T [ j ] S[i]=T[j] S[i]=T[j],該點成功匹配,繼續(xù)比較。若 j j j越界則為成功匹配,j=0進行下次匹配。
      • S [ i ] ≠ T [ j ] S[i]\ne T[j] S[i]=T[j],則為二者的失配點,回溯二者的匹配指針。二者在失配前均為成功匹配,匹配指針一直同步變化, j j j為相對于匹配開始點的增量,因此本輪匹配起點即為 i ? j i-j i?j i i i回溯到起點的下一個位置i=i-j+1j=0
      string s,t;
      vector<int>ans;//記錄所有成功匹配開始點下標
      void bf(){
          int i=0,j=0;
          while(i<s.size()){
              if(t[j]==s[i]){
                  i++,j++;
                  if(j>=t.size()) ans.push_back(i-t.size()),j=0;//j越界則產(chǎn)生答案
              }else i=i-j+1,j=0;//匹配失敗,回溯
          }
      }
      

      KMP( O ( ∣ S ∣ + ∣ T ∣ ) O(|S|+|T|) O(S+T))

      KMP是在BF上進行改進的單模匹配算法,其主要改進是最長公共前后綴數(shù)組,以避免大量的非必要回溯。

      大量回溯的不必要性

      設(shè)源串 S S S的匹配指針為 i i i,模式串 T T T的匹配指針為 j j j。設(shè)當(dāng)前輪匹配的失配點前, S S S中成功匹配部分為其子串 S ′ S' S T T T中成功匹配部分為其前綴 T ′ T' T S ′ S' S T ′ T' T完全相同。

      • T ′ T' T中每個字符都不同:失配時暴力法的回溯為i=i-j+1j=0,但 i i i的回溯是完全不必要的。由于 T ′ T' T中每個字符都不同,因此S[i-j+1]也不可能與T[0]相同。 i i i不動,j=0即可。
      • T ′ T' T中有部分字符相同,且相同部分為 T ′ T' T的長度為 L L L的前綴和后綴: S ′ S' S也具有等長的相同前后綴,因此 T ′ T' T前綴與 S ′ S' S后綴已經(jīng)匹配,這部分無需重復(fù)匹配。失配時 i i i不動, j j j移動到 T ′ T' T前綴的下個位置L繼續(xù)匹配即可。
      • T ′ T' T中部分字符相同,且相同部分并非 T ′ T' T的前綴和后綴:此種情況等價于 T ′ T' T中每個字符都不同。 i i i不動,j=0即可。
        在這里插入圖片描述
        由此可得, i i i完全沒有必要回溯,只對 j j j回溯即可

      最長公共前后綴數(shù)組

      定義數(shù)組 N e x t [ j ] Next[j] Next[j],設(shè)模式串 T T T的前 j ? 1 j-1 j?1個字符構(gòu)成其前綴 T ′ T' T,則 N e x t [ j ] Next[j] Next[j]存儲 T ′ T' T的前綴與后綴的最長交集長度(注意此處均指不包含 T ′ T' T自身的真前后綴),則 T ′ T' T的后綴中最后下標為 j ? 1 j-1 j?1 T ′ T' T前綴中最后下標為 N e x t [ j ] ? 1 Next[j]-1 Next[j]?1(公共長度-1,注意字符串下標從 0 0 0開始),代表當(dāng)失配時, j j j所回溯的位置

      • T [ i ] = T [ j ] T[i]=T[j] T[i]=T[j],則 [ 0 , i ] [0,i] [0,i]的長度轉(zhuǎn)移 [ 0 , i ? 1 ] [0,i-1] [0,i?1]的長度并 + 1 +1 +1 N e x t [ i + 1 ] = N e x t [ i ] + 1 Next[i+1]=Next[i]+1 Next[i+1]=Next[i]+1
      • T [ i ] ≠ T [ j ] T[i]\ne T[j] T[i]=T[j],則前綴與后綴失配,屬于回溯分析中的情況3,后綴失去后綴特性,無法在KMP中用于直接跳躍, j j j回溯。 N e x t [ i + 1 ] = 0 , j = N e x t [ j ] Next[i+1]=0,j=Next[j] Next[i+1]=0,j=Next[j]

      獲取最長公共前后綴數(shù)組的本質(zhì):模式串本身在進行自我模式匹配

      string s,t;//下標從0開始
      vector<int>Next,ans;//注意next是cpp的關(guān)鍵字
      void getNext(){//本質(zhì):模式串在進行自我模式匹配
          Next.resize(t.size()+1);
          Next[0]=0,Next[1]=0;//Next[0]不用;由于在找真前后綴的最長交集長度,因此Next[1]為0
          for(int i=1;i<t.size();i++){
              int j=Next[i];
              while(j&&t[i]!=t[j]) j=Next[j];//j在失配點跳躍到Next[j]
              if(t[i]==t[j]) Next[i+1]=j+1;//[0,i]的答案轉(zhuǎn)移自[0,i-1]+1
              else Next[i+1]=0;//后綴失去后綴特性
          }
      }
      void kmp(){
          getNext();
          int j=0;
          for(int i=0;i<s.size();i++){
              while(j&&s[i]!=t[j]) j=Next[j];//j在失配點跳躍到Next[j]
              if(s[i]==t[j]) j++;
              if(j==t.size()) ans.push_back(i+1-t.size());//j越界,則匹配成功
          }
      }
      
      posted @ 2025-01-16 15:18  椰蘿Yerosius  閱讀(52)  評論(0)    收藏  舉報  來源
      主站蜘蛛池模板: 久久这里只有精品免费首页| 欧美人与禽2o2o性论交| 精品国产一区二区在线视| 枣强县| 国产成人精品亚洲资源| 亚洲国产午夜精品理论片| 国产SUV精品一区二区88L| 日韩精品不卡一区二区三区| 国产在线线精品宅男网址| 国产亚洲无线码一区二区| 性一交一乱一乱一视频| 中文字幕国产精品一区二| 精品人妻中文字幕av| 天天综合亚洲色在线精品| 日韩精品一区二区三区激情 | 午夜激情福利一区二区| 狠狠干| 好吊妞人成视频在线观看27du| 自拍偷自拍亚洲精品熟妇人| 亚洲春色在线视频| 久久月本道色综合久久| 日韩乱码人妻无码中文字幕视频| 成人免费无遮挡在线播放| 日本五十路熟女一区二区| 日韩一区二区在线观看视频 | 亚洲免费人成视频观看| 饥渴的熟妇张开腿呻吟视频| 麻豆一区二区三区香蕉视频 | 午夜免费福利小电影| 国产免费午夜福利在线播放| 性少妇tubevⅰdeos高清| 精品国产午夜福利在线观看| 久久久亚洲精品无码| 九九热在线精品免费视频| 小嫩批日出水无码视频免费| 人妻系列无码专区免费| 我要看亚洲黄色太黄一级黄| 亚洲最大成人av在线天堂网| 国产无遮挡免费视频免费| 国产草草影院ccyycom| 日韩av综合中文字幕|