我們先說下定義,比如說我們要在a字串中查詢字串b,那麼a就是主串,b就是模式串
我們把主串的長度記為n,把模式串的長度記為m,n>m
bf(brute force)中文名:暴力匹配演算法,樸素匹配演算法
簡單的說bf的演算法就是在主串中查詢起始位置是0,1,2,,,n-m個且長度為m的n-m+1個子串,看看有沒有跟模式串匹配的
如下圖所示
下面是我用php實現的bf演算法的**,很簡單
function bfstring($mainstring = 'abcdefghijklmn', $patternstring = 'lmn') } return ['ismatch' => $ismatch, 'truematchcount' => $truematchcount]; }
這種演算法的時間複雜度是o(n*m),可以看出來很暴力,但是實際運用中,這種演算法用的還是很多的
原因:1:實現起來簡單,出bug以後容易修復
2:實際軟體開發中,主串和模式串的長度都不會很長,而且在匹配中當模式串遇到不能匹配的字元時就停止了,不需要把m個字元都匹配
字串匹配演算法rk(rabin-karp)演算法
這個演算法的核心就是計算出模式串的雜湊值,然後依次和主串中每個子串的雜湊值進行比較
因為雜湊值計算出來的是數字,數字和數字比較速度會比字串和字串比較速度快
所以說這個演算法就是bf演算法的改進版
實現**如下
/** * 字串匹配演算法rk(rabin-karp)演算法 */ function rkstring($mainstring, $patternstring) } return ['ismatch' => $ismatch, 'truematchcount' => $truematchcount, 'nowstring' => $nowstring, 'nowstringhash' => $nowstringhash]; } /** * 字母轉成26進製(雜湊) * @param $num * @param int $bin * @return float|int */ public static function rkstringhash($string, $bin = 26) $i++; } return $total; }
字串正則匹配
匹配1個或多個 匹配乙個 abc a b false abc a?c true abc a true ab a false 重點就是處理掉 如果匹配的時候 後面沒有字元了那返回真,如果有的話,那麼很簡單,從str中從後往前拿pattern 中 從 開始到pattern末尾個字元個數的字元,繼續遞迴匹...
正則匹配字串小記
需求1.現有 裝置名 dev.json 裝置名 廠商名 型號名 dev.json 裝置名.json 廠商名 型號名.json 型號名 廠商名.json 裝置名 廠商名 bu.json 等字串,要求匹配出符合規則的字串,並且根據傳入的裝置名或者廠商名或者型號名講字串中對應的內容修改。裝置名 字串規則 ...
字串匹配
題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...