參考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 ...