通用字串匹配,動態規劃

2021-08-28 13:29:12 字數 1499 閱讀 4578

題目如下:

給定乙個字串 (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 ...