題目如下:
給定乙個字串 (s
) 和乙個字元模式 (p
)。實現支援'.'
和'*'
的正規表示式匹配。
'.' 匹配任意單個字元。
'*' 匹配零個或多個前面的元素。
匹配應該覆蓋整個字串 (s
) ,而不是部分字串。
說明:示例 1:
輸入:s = "aa"
p = "a"
輸出: false
解釋: "a" 無法匹配 "aa" 整個字串。
示例 2:
輸入:s = "aa"
p = "a*"
輸出: true
解釋: '*' 代表可匹配零個或多個前面的元素, 即可以匹配 'a' 。因此, 重複 'a' 一次, 字串可變為 "aa"。
示例 3:
輸入:s = "ab"
p = ".*"
輸出: true
解釋: ".*" 表示可匹配零個或多個('*')任意字元('.')。
示例 4:
輸入:s = "aab"
p = "c*a*b"
輸出: true
解釋: 'c' 可以不被重複, 'a' 可以被重複一次。因此可以匹配字串 "aab"。
示例 5:
輸入:s = "mississippi"
p = "mis*is*p*."
輸出: false
題目分析:『.』可以替代任何字串,'*'可以把其前面的字元變成0-n個,例如' a* '可以變成'空' , 'a' , 'aa',...任意個a;' .* '可以代表任意長度的任意字串 ,匹配可以看出不停的比較兩個字串,儲存之前的比較結果可以極大節省時間;
int m = s.size();
int n = p.size();
vector> f(m + 1, vector(n + 1, false));
採用vector的巢狀使用,形成乙個二維陣列,初始化值都預設為false;
這個陣列中f[i][j]代表s中的前i個字元組成的字串可以與p中的前j個字元組成的字串可以匹配;只要我們求得f陣列裡f[m][n]的值
就得到了兩個字串是否匹配
f[0][0] = true;//空與空可匹配
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
例如:f[0][0] = true 代表,s為空,p為空;
注意:字串的下標比矩陣的中的下標小1,例如:f[1][1]對應的是s[0]是否和p[0]匹配
當為' * '的時候,從橫向增長p,和縱向增長s來考慮
for(int i = 1; i <= m; i++)else}}
return f[m][n];
帶萬用字元的字串匹配 動態規劃
描述 萬用字元是一類鍵盤字元,當我們不知道真正字元或者不想鍵入完整名字時,常常使用萬用字元代替乙個或多個真正字元。萬用字元有問號 和星號 等,其中,可以代替乙個字元,而 可以代替零個或多個字元。你的任務是,給出乙個帶有萬用字元的字串和乙個不帶萬用字元的字串,判斷他們是否能夠匹配。例如,1?456 可...
字串匹配問題 遞迴和動態規劃
題目 給定字串str,其中絕對不含有字元 和 再給定字串exp,其中可以含有 或 字元不能是exp的首字元,並且任意兩個 字元不相鄰。exp中的 代表任何乙個字元,exp中的 表示 的前乙個字元可以有0個或者多個。請寫乙個函式,判斷str是否能被 exp匹配。舉例 str abc exp abc 返...
動態規劃和字串匹配(KMP AC自動機)
最近學了關於字串匹配主要的兩種方法,做了一些題目,發現這可以動態規劃結合,題目中往往有 t是s的子串 這類字眼,而且答案要求 最少 最多 多少種 一類的問題。解決這類問題往往是要記錄乙個 匹配到哪一位 的狀態,然後考慮當前狀態可以更新哪些新的狀態,下面列舉兩道題目 kmp 有兩個字串s和t 1 s ...