動態規劃 —— 求解萬用字元問題(wildcard)
阿新 • • 發佈:2019-02-01
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
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;
}
}