1. 程式人生 > >動態規劃 —— 求解萬用字元問題(wildcard)

動態規劃 —— 求解萬用字元問題(wildcard)

  • he?p

    • help, heap, √
    • hellp, ×
  • *p*(必須包含 p,左右隨意)

    • help, papa, √
    • hello ×
  • *bb*(必須包含連續的兩個 bb,左右隨意)

    • babbc √

1. 窮舉法的處理

? 的匹配處理其實很好處理,困難的地方還在於 * 的匹配問題。

假定給定的正規化包含 m 個“*”,每次出現“*”就分割 1 次正規化。那麼,“此正規化是否對應字串”的問題可分為 m+1 個子問題。例如,正規化t*l?*o*r?ng*s可分為{t*, l?*, o*, r?ng*, s}。那麼當給出字串thelordoftherings

時,為了找出字串中的前幾個對應第一個分割快,窮舉搜尋法會嘗試所有可能的組合。找出對應於第一個分割快的 3 (本例為前 3 )個字元後,利用遞迴呼叫就能很容易地判斷出剩下的字串lordoftings是否對應於剩餘的 4 個分割快。

bool match(const string& w, const string& s){
    int pos = 0;
    while (pos < w.size() && pos < s.size() && (w[pos] == '?' || w[pos] == s[pos]))
        ++pos
; if (pos == w.size()) return pos == s.size(); if (w[pos] == '*'){ for (int skip = 0; pos + skip <= s.size(); ++skip){ if (match(w.substr(pos+1), s.substr(pos+skip))) return true; // pos + skip <= s.size() // 匹配全部 } return
false; } }