單純做個記錄~
題目會給我們輸入兩個字串s
和p
,s
代表文字,p
代表模式串,請你判斷模式串p
是否可以匹配文字s
。
正則表達演算法問題只需要把住乙個基本點:看兩個字元是否匹配,一切邏輯圍繞匹配/不匹配兩種情況展開即可。
動態規劃演算法的核心就是「狀態」和「選擇」,「狀態」無非就是i
和j
兩個指標的位置,「選擇」就是p[j]
選擇匹配幾個字元。
dp
函式的定義如下:
若dp(s,i,p,j) = true
,則表示s[i,i+1,...,m-1]
可以匹配p[j,j+1,...,n-1]
;
若dp(s,i,p,j) = false
,則表示s[i,i+1,...,m-1]
無法匹配p[j,j+1,...,n-1]
。
簡單版本(無memory)
#include#includeusing namespace std;
bool dp(string &s, int i, string &p, int j)
if (i == m)
for (; j + 1 < n; j += 2)
} return true;
} //狀態選擇
if (s[i] == p[j] || p[j] == '.')
else
} else
else
} return res;
}bool ismatch(string s, string p)
int main()
} return 0;
}
改進版本
加入mapmemo,消除重疊子問題
#include#include#includeusing namespace std;
mapmemo;
/* 計算 p[j..] 是否匹配 s[i..] */
bool dp(string& s, int i, string& p, int j)
if (i == m)
for (; j + 1 < n; j += 2)
} return true;
} // 記錄狀態 (i, j),消除重疊子問題
cout << i << "," << j << endl;
string key = to_string(i) + "," + to_string(j);
if (memo.count(key)) return memo[key];
bool res = false;
if (s[i] == p[j] || p[j] == '.')
else
} else
else
} // 將當前結果記入備忘錄
memo[key] = res;
return res;
}bool ismatch(string s, string p)
int main()
for (auto iter = memo.begin(); iter != memo.end(); iter++)
}
**中用了乙個雜湊表memo
消除重疊子問題,因為正則表達演算法的遞迴框架如下:
bool dp(string& s, int i, string& p, int j)
那麼,如果讓你從dp(s, i, p, j)
得到dp(s, i+2, p, j+2)
,至少有兩條路徑:1 -> 2 -> 2
和3 -> 3
,那麼就說明(i+2, j+2)
這個狀態存在重複,這就說明存在重疊子問題。
動態規劃的時間複雜度為「狀態的總數」*「每次遞迴花費的時間」,本題中狀態的總數當然就是i
和j
的組合,也就是m * n
(m
為s
的長度,n
為p
的長度);遞迴函式dp
中沒有迴圈(base case 中的不考慮,因為 base case 的觸發次數有限),所以一次遞迴花費的時間為常數。二者相乘,總的時間複雜度為o(mn)
。
空間複雜度很簡單,就是備忘錄memo
的大小,即o(mn)
。
正規表示式匹配演算法
看 之美 之美中有個簡短而高效的正規表示式匹配演算法,這裡給一下簡單的實現,供學習使用。include include includeusing namespace std int match char regexp,char text int matchhere char regexp,char ...
演算法 正規表示式匹配
給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例...
演算法 正規表示式匹配。
給你乙個字串s和乙個字元規律p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。輸入 s aa p a 輸出 false解釋 a 無法匹配 aa 整個字串。輸入 s aa p a 輸出 true 解釋 ...