Leetcode 兩個字串的萬用字元匹配

2021-10-07 19:29:42 字數 2049 閱讀 6054

分析2:

注意事項:

給定乙個字串 (s) 和乙個字元模式 § ,實現乙個支援 『?』 和 『!』 的萬用字元匹配。

『?』 可以匹配任何單個字元。

『!』 可以匹配任意字串(包括空字串)。

說明:s 可能為空,且只包含從 a-z 的小寫字母。

p 可能為空,且只包含從 a-z 的小寫字母,以及字元 ? 和 !。

示例:s = 「adceb」

p = 「!a!b」

輸出true–第乙個』!『匹配空字元,第二個』!'匹配dce

此題類似於劍指offer上的19題,可以用類似劍指offer的19題的解法輕鬆解決此題。

bool

ismatch

(char

* s,

char

* p)if(

strlen

(p)==0&&

strlen

(s)!=0)

if(strlen

(s)==0)

}return

true;}

int m =0;

int n =0;

while

(*s!=

'\0'

&&*p!=

'\0'

)elseif(

*s !=

*p &&

*p ==

'!')

//如果!匹配任意字串

else

s++;}

if(*s ==

'\0'

||*p ==

'\0'

)else}}

elseif(

*s !=

*p)else

}///如果迴圈退出來是因為s走到了尾部,判斷p剩下的是否全為'!'if(

*s ==

'\0')}

return

true;}

if(*p ==

'\0'

)}

因為在leetcode題上給的s、p的引數型別為string,所以不能使用第一種方法,

因為』!『字元的出現,導致乙個問題的結果與前面的子問題的結果有所關聯,所以我們嘗試使用動態規劃。動態規劃最重要的兩部:1.怎麼定義dp陣列。2.dp陣列定義後推導公式是什麼。3.初始化陣列的邊界情況。

我們可以定義dp[i][j]表示s的前i個字元與p的前j個字元是否相匹配,最後程式返回dp[n][m],n表示s的長度,m表示p的長度。

推導公式:

1.p為『?』時,dp[i][j] = dp[i-1][j-1]。

2.p為』!『時,我們有兩種情況,1—』!『匹配空字元。2—』!『匹配任意長度的任意字元

dp[i][j] = dp[i][j-1] | dp[i-1][j]。

dp[i][j-1]表示』!『匹配空字元,dp[i-1][j]表示』!'匹配任意長度的任意字元。

初始化邊界:

dp[0][0] = true,兩個字串都為空的話可以匹配。

dp[i][0] = false,如果p為空的話不能匹配。

dp[0][j] = true,j表示p的前j個字元都為』!』,因為』!'可以匹配空字元。

bool

ismatch

(string s,string p)

else

}//這個題最難想的地方就是p[j] == '!'時的狀態轉移方程

for(

int i =

1; i <= m;

++i)

else

if(p[j -1]

=='?'

|| s[i -1]

== p[j -1]

)}}return dp[m]

[n];

}

一定要耐心分析動態規劃–如何定義dp陣列,dp陣列的推導,dp陣列的邊界情況,相信自己,多思考就一定能想出來!!

連線兩個字串

include include void main char lianjie char a 30 char b 30 原型 extern char strcat char dest,char src 用法 include 功能 把src所指字串新增到dest結尾處 覆蓋dest結尾處的 0 並新增 ...

交換兩個字串

交換兩個字串,原來的字串分別為 學生 和 好 字串輸出顯示為 學生好 交換後輸出顯示為 好學生 include using namespace std int main char c1 5 學生 char c2 3 好 char m,n,t m c1 n c2 cout 交換前 m n n t co...

兩個字串相乘

先附上一張演算法圖 解釋 123 456 首先拿出1和456相乘,儲存到陣列1 2 3 的位置,然後拿出2和456相乘2 3 4的位置,依次類推,直到第乙個字串遍歷完 然後將他們相加,依次存到陣列中 實現如下 int j 0 int resindex 0 for int i 0 i然後再考慮進製,需...