Implement wildcard pattern matching with support for '?'
and '*'
.
'?' Matches any single character.'*' Matches any sequence of characters (including the empty sequence).The matching should cover the entire input string (not partial).The function PRototype should be:bool isMatch(const char *s, const char *p)Some examples:isMatch("aa","a") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "*") → trueisMatch("aa", "a*") → trueisMatch("ab", "?*") → trueisMatch("aab", "c*a*b") → false思路一:
代碼如下:
class Solution {public: bool isMatch(string s, string p) { int sIndex=0,pIndex=0,match=0,starIdx=-1; while(sIndex < s.length()) { if(pIndex < p.length() && (p[pIndex] == '?' || p[pIndex] == s[sIndex])) { pIndex++; sIndex++; } else if(pIndex < p.length() && p[pIndex] == '*') { starIdx = pIndex; pIndex++; match = sIndex; } else if(starIdx!=-1) { pIndex = starIdx+1; match++; sIndex = match; } else return false; } while(pIndex<p.length() && p[pIndex] == '*') pIndex++; return pIndex == p.length(); }};思路二:使用大殺器 -動態規劃,列出動態方程如下:
if p[j-1] != '*', then dp[i][j] = dp[i-1][j-1] && (s[i-1] == p[j-1] || p[j-1] == '?')
if p[j-1] == '*', then dp[i][j] = dp[i-1][j] || dp[i][j-1]
需要注意的是dp方程組的初始化,dp[0][i](i=1,2,3...)根據p來進行,因為*可以代表空,所以當開頭字串為*時,需要在dp[0][i]中相應位置設為true。 最后dp[0][0]設置為true
代碼如下:
class Solution {public: bool isMatch(string s, string p) { int m = s.length(),n=p.length(); bool dp[m+1][n+1]; memset(dp,false,sizeof(bool)*(m+1)*(n+1)); dp[0][0] = true; for(int i=1;i<=n;i++) { if(p[i-1] == '*') dp[0][i] = true; else break; } 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-1] && (s[i-1] == p[j-1] || p[j-1] == '?'); else if(p[j-1] == '*') dp[i][j] = dp[i-1][j] || dp[i][j-1]; } return dp[m][n]; }};
新聞熱點
疑難解答