版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ghscarecrow/article/details/86602241
Given an input string (s
) and a pattern (p
), 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).
Note:
s
could be empty and contains only lowercase lettersa-z
.p
could be empty and contains only lowercase lettersa-z
, and characters like?
or*
.
Example 1:
Input:
s = "aa"
p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".
Example 2:
Input:
s = "aa"
p = "*"
Output: true
Explanation: '*' matches any sequence.
Example 3:
Input:
s = "cb"
p = "?a"
Output: false
Explanation: '?' matches 'c', but the second letter is 'a', which does not match 'b'.
Example 4:
Input:
s = "adceb"
p = "*a*b"
Output: true
Explanation: The first '*' matches the empty sequence, while the second '*' matches the substring "dce".
Example 5:
Input:
s = "acdcb"
p = "a*c?b"
Output: false
与leetcode上面的第10题正则匹配表达式不同,这道题的模式p的第一个字符是有可能出现*号的,而不像正则表达式那样*号只出现在.号后面。采用动态规划思想对该题进行解答。
具体代码如下:
class Solution {
public boolean isMatch(String s, String p) {
boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
dp[s.length()][p.length()] = true;
//考虑到p模式第一个字符为*
for(int i = p.length() - 1;i >= 0;i--) {
if(p.charAt(i) == '*') {
dp[s.length()][i] = true;
//break;
} else {
break;
//dp[s.length()][i] = true;
}
}
//dp[i][j]代表s从i开始截取,p从j开始截取
for(int i = s.length() - 1;i >= 0;i--) {
for(int j = p.length() - 1;j >= 0;j--) {
if(s.charAt(i) == p.charAt(j) || p.charAt(j) == '?') {
dp[i][j] = dp[i + 1][j + 1];
} else if(p.charAt(j) == '*') {
dp[i][j] = dp[i+1][j] || dp[i][j+1];
} else {
dp[i][j] = false;
}
}
}
return dp[0][0];
}
}
10. Regular Expression Matching
leetcode上面大佬的代码,对比着看
class Solution {
public boolean isMatch(String str, String pattern) {
int s = 0, p = 0, match = 0, starIdx = -1;
while (s < str.length()){
// advancing both pointers
if (p < pattern.length() && (pattern.charAt(p) == '?' || str.charAt(s) == pattern.charAt(p))){
s++;
p++;
}
// * found, only advancing pattern pointer
else if (p < pattern.length() && pattern.charAt(p) == '*'){
starIdx = p;
match = s;
p++;
}
// last pattern pointer was *, advancing string pointer
else if (starIdx != -1){
p = starIdx + 1;
match++;
s = match;
}
//current pattern pointer is not star, last patter pointer was not *
//characters do not match
else return false;
}
//check for remaining characters in pattern
while (p < pattern.length() && pattern.charAt(p) == '*')
p++;
return p == pattern.length();
}
}