分析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然後再考慮進製,需...