#leetcode刷题之路44-通配符匹配
给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。
'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
示例 1:
输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:
s = "aa"
p = "*"
输出: true
解释: '*' 可以匹配任意字符串。
示例 3:
输入:
s = "cb"
p = "?a"
输出: false
解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
思路1:
这是我第一反应的做法,就是用两个指针按顺序遍历。因为遇到‘?’时和两个字符相等是一样的操作,所以这道题主要是讨论遇到‘*’时的操作,这时需要加入一些辅助指针。
所有定义的指针为:ss(指向当前位置或pp遇到‘*’的位置)//// pp(指向一个普通位置或当前最后一个‘*’之后的位置) ////sstar (用于跳过s串中的字符)//// pstar(固定指向当前遇到的最后一个*)
#include <iostream> using namespace std; bool isMatch(string s, string p) { char*ss=(char*)s.data(); char*pp=(char*)p.data(); char*sstar= nullptr; char*pstar= nullptr; while(*ss) { if(*ss==*pp||*pp=='?') { ss++; pp++; } else if(*pp=='*') { pstar=pp++; sstar=ss; } else if(pstar) { pp=pstar+1; ss=++sstar; } else return false; } while(*pp == '*') ++pp; return !*pp; } int main() { string s="aaaa"; string p="***a"; std::cout <<isMatch(s,p) << std::endl; return 0; }
思路二:
动态规划法(https://www.cnblogs.com/daleyzou/p/9535134.html):
bool isMatch(string s, string p) { bool **dp=new bool *[s.length()+1];//s.length()+1个bool*类型的一维指针 for(int i=0;i<s.length()+1;i++) { dp[i]=new bool[p.length()+1]; memset(dp[i],0,(p.length()+1)*sizeof(bool)); } dp[0][0]= true; for(int i=0;i<p.length();i++) { if(dp[0][i]&&p[i]=='*') dp[0][i+1]=true; } for (int i = 0; i < s.length(); i++){ for (int j = 0; j < p.length(); j++){ if (p[j] == '*'){ dp[i + 1][j + 1] = dp[i][j+1] || dp[i+1][j]; }else if (p[j] == '?' || s[i] == p[j]){ dp[i + 1][j + 1] = dp[i][j]; } } } return dp[s.length()][p.length()]; }