给定一个字符串 (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'。 示例 4:
输入: s = "adceb" p = "*a*b" 输出: true 解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce". 示例 5:
输入: s = "acdcb" p = "a*c?b" 输入: false
思路:和之前https://blog.csdn.net/haut_ykc/article/details/94605088动态规划思路一毛一样,只是简单的改了改。
class Solution { public boolean isMatch(String s, String p) { int len1=s.length(); int len2=p.length(); boolean[][] dp=new boolean[len1+1][len2+1]; dp[len1][len2]=true; for(int i=len1;i>=0;i--) for(int j=len2;j>=0;j--) { if(i==len1 && j==len2) continue; boolean first_match=(i<len1 && j<len2 && (s.charAt(i)==p.charAt(j) || p.charAt(j)=='?' || p.charAt(j)=='*')); if(j<len2 && p.charAt(j)=='*') dp[i][j]=dp[i][j+1] || first_match && dp[i+1][j]; else dp[i][j]=first_match && dp[i+1][j+1]; } return dp[0][0]; } }
