leetcode 44 字符匹配
題意:s是空串或包含a-z字母;
p為包含a-z字母或?或 * (其中*可以匹配任意字符串包括空串,?可以匹配任意字符)。
思路:
1)特殊情況:當(dāng)s為空串時(shí),p為連續(xù) * 時(shí),則連續(xù) * 的位置都為true。
2)若p的第j個(gè)字符為 * ,分兩種情況:
a)? 若p中的前 j-1個(gè)字符和 s 中的前 i 個(gè)字符匹配成功了, 即 dp[i][j-1] == true , 因?yàn)?* 可以匹配空串,則 dp[i][j] == true;
b)? 若p中的前 j 個(gè)字符和 s 中前 i-1 個(gè)字符匹配成功了,即 dp[i-1][j] == true , 因?yàn)?* 可以匹配任意字符串,則 dp[i][j] == true.
3) ? 若p中的第j個(gè)字符不是 * 時(shí),則需要滿足 dp[i-1][j-1] == true 和 s 中的第i個(gè)字符和p中的第j個(gè)字符相等, 即 s[i-1] == p[j-1], 或者 p中的第j個(gè)字符是問(wèn)號(hào), 即 p[j-1] == '?' 則 dp[i][j] == true.
注意:dp[][] 初始化申請(qǐng)空間大小要為 (m+1, n+1) ,因?yàn)閐p[0][0] 為p和s為空串時(shí)候的情況。
dp如果用二維數(shù)組定義會(huì)超時(shí)!所以用二維vector。
注:s[i-1] 代表s中第i位字符。
class Solution { public:bool isMatch(string s, string p) {int m = s.size();int n = p.size();//dp[i][j]:s中前i個(gè)字符組成的子串和p中前j個(gè)字符組成的子串是否能匹配//bool dp[m+1][n+1] = {false};vector<vector<bool> > dp(m+1, vector<bool>(n+1, false));//s,p都為空,返回0dp[0][0] = true;//s為空, p為連續(xù)星號(hào)時(shí),賦值為truefor(int i = 1; i <= n; i++){if(p[i-1] == '*') dp[0][i] = dp[0][i-1];}for(int i=1; i<=m; i++){for(int j=1; j<=n; j++){if(p[j-1] == '*')dp[i][j] = dp[i-1][j] || dp[i][j-1];elsedp[i][j] = (s[i-1]==p[j-1] || p[j-1] == '?') && dp[i-1][j-1];}}return dp[m][n];} };?
?
轉(zhuǎn)載于:https://www.cnblogs.com/Bella2017/p/10644299.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的leetcode 44 字符匹配的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SpringBoot 之Quartz的使
- 下一篇: jatoolsprinter web打印