萬用字元 DP

2021-09-24 21:59:59 字數 1831 閱讀 2776

參考eyedeng github

萬用字元可用於代替單個或多個字元 。通常地,星號*匹配0個或以上的字元,問號?匹配1個字元。

dengy test $ ls

1001.cpp 1001.exe* 1002.cpp 1002.exe* f1 f10 f100 f2 f20 f3 f5

dengy test $ ls f?

f1 f2 f3 f5

dengy test $ ls f*

f1 f10 f100 f2 f20 f3 f5

dengy test $ rm *.exe

dengy test $ ls

1001.cpp 1002.cpp f1 f10 f100 f2 f20 f3 f5

萬用字元用來模糊搜尋檔案。當查詢檔案夾時,可以使用它來代替乙個或多個真正字元;當不知道真正字元或者懶得輸入完整名字時,常常使用萬用字元代替乙個或多個真正的字元。功能強大。

詳細用法

給定字串w,s。判斷萬用字元正規化w是否與字串s相對應。

事先無法確定「 * 」對應幾個字元。解決:將包含m個「 * 」的正規化分解成m+1部分,「此正規化是否對應字串」問題分解為m+1個子問題。例如:正規化 t*l?*o*r?ng*s 可分為 5部分。給出字串 s = 「thelordoftherings」 時,為了找出s中有幾個字元對應第乙個分割塊,窮舉搜尋法會嘗試所有可能組合。找出對應第乙個分割塊的3個字元後,遞迴呼叫判斷"lordoftherings"是否對應餘下4個塊。

//      thelordoftherings	t*l?*o*r?ng*s

bool

match

(const string& w,

const string& s)

if(pos == w.

size()

)if(w[pos]

=='*')}

}return

false

;}

w和s不再匹配時,退出while,有以下情況。

w[pos] != s[pos]:對應失敗。

匹配完了w最後乙個字元。此時w和s必須完全相等才能成立對應關係。

匹配完了s最後乙個字元,w有剩餘。此時剩餘必須全為「*」相等才能成立對應關係。

w[pos]為「*」。因未知「*」對應幾個字元,所以利用0~len(剩餘字元)迴圈檢索所有可能性。

注意:**中情況3合併到了情況4。

當輸入為 w = 「******a」,s = "aaaaaaab"時,存在大量重複計算。

所以把計算過的值存入cache表。

int cache[

101]

[101];

string s =

"aaaab"

;//"thelordoftherings";

string w =

"**a"

;//"t*l?*o*r?ng*s";

bool

mem_match

(int w,

int s)

if(w == w.

size()

)if(w[w]

=='*')}

}return ret =0;

}int

main()

《演算法問題實戰策略》[韓] 具萬宗

DP萬用字元匹配

給定乙個字串 s 和乙個字元模式 p 實現乙個支援 和 的萬用字元匹配。可以匹配任何單個字元。可以匹配任意字串 包括空字串 兩個字串完全匹配才算匹配成功。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 輸入 s adceb p a b ...

dp 萬用字元匹配leetcode44

這一題是劍指offer裡面的題目,但是書本裡的解法自頂向下,不太好理解。假設string長度為s,pattern長度為p,設定狀態dp,為 dp s 1 p 1 狀態含義 dp i j 表示pattern的1到j位是否匹配s的1 i位 初始狀態 dp 0 0 1 dp 0 i p i dp 0 i ...

44 萬用字元匹配。 DP

給定乙個字串 s 和乙個字元模式 p 實現乙個支援 和 的萬用字元匹配。可以匹配任何單個字元。可以匹配任意字串 包括空字串 兩個字串完全匹配才算匹配成功。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例 1 輸入 s aa p a ...