PHP 字串匹配演算法 Sunday演算法

來源:互聯網
上載者:User

搜尋文本 text = "my testing algorithm in test"

模式 pattern = "test"

Sunday演算法的關鍵點在於

1.設定一個匹配位移映射 shift[],這個shift[]映射關係必須按從左至右的順序簡曆,例如pattern = "test",注意到此處有2個t,那麼建立出來的位移映射是 shift[] = Array ( [t] => 1 [e] => 3 [s] => 2 ),而如果不是從左至右,是從右至左的建立映射,就會變成 shift[] = Array ( [t] => 4 [e] => 3 [s] => 2),這樣到時候匹配就無法得到正確結果

2.根據當前比對字串的下一個字元來確定位移長度,如

第一次比較的時候,1,第一個字元“m”就和“t”不一樣,那就尋找比patter長1位的text中的字元,為“e”,然後尋找映射表,e => 3,接下來把pattern向後移動3位,就到了,圖2中的位置,再從“t”開始比較,發現匹配到了繼續往後,看text中比pattern長1的那個字元,為“i”,此時發現映射表中沒有“i”,則直接將pattern向後移動pattern_size位,就到了圖3,然後重複前面的過程,直到比較到text_size - patter_size為座標的那個字元

 

下面是代碼:

 1 <?php 2     #字串匹配,sunday演算法 3      4     function sunday($patt, $text) { 5         $patt_size = strlen($patt); 6         $text_size = strlen($text); 7  8         #初始化字串位移映射關係 9         #此處注意,映射關係表的建立一定是從左至右,因為patten可能存在相同的字元10         #對於重複字元的位移長度,我們只能讓最後一個重複字元的位移長度覆蓋前面的位移長度11         #例如pattern = "testing",注意到此處有2個t,那麼建立出來的位移映射是 shift[] = Array ( [t] => 4 [e] => 6 [s] => 5 [i] => 3 [n] => 2 [g] => 1 )12         #而如果不是從左至右,是從右至左的建立映射,就會變成 shift[] = Array ( [t] => 7 [e] => 6 [s] => 5 [i] => 3 [n] => 2 [g] => 1 ),這樣到時候匹配就無法得到正確結果13         for ($i = 0; $i < $patt_size; $i++) {14             $shift[$patt[$i]] = $patt_size - $i;15         }16 17         $i = 0;18         $limit = $text_size - $patt_size; #需要開始匹配的最後一個字元座標19         while ($i <= $limit) {20             $match_size = 0; #當前已匹配到的字元個數21             #從i開始匹配字串22             while ($text[$i + $match_size] == $patt[$match_size]) {23                 $match_size++;24                 if ($match_size == $patt_size) {25                     echo "Match index: {$i} <br>";26                     break;27                 }28             }29 30             $shift_index = $i + $patt_size; #在text中比pattern的多一位的字元座標31             if ($shift_index < $text_size && isset($shift[$text[$shift_index]])) {32                 $i += $shift[$text[$shift_index]];33             } else {34                 #如果映射表中沒有這個字元的位移量,直接向後移動patt_size個單位35                 $i += $patt_size;36             }37         }38     }39 40     $text = "my testing algorithm test";41     $patt = "test";42 43     sunday($patt, $text);44 ?>

 

 

Match index: 3 
Match index: 21

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.