题目描述查看:https://leetcode-cn.com/problems/wildcard-matching/
题目的意思是给一个字符串s,给一个模式串p,要看p和s匹不匹配。模式串里可以出现'?',匹配一个任意字符;可以出现'*',匹配0个或多个任意字符。
-
思路
创建一个数组dp[i][j]用来保存模式串p中的前i个字符和字符串s中的前j个字符匹不匹配。
dp[0][0]表示p中0个字符和s中0个字符匹不匹配,显然匹配。
dp[0][0] = true;
dp[0][i]表示p中0个字符和s中[1,s.length]之间个字符匹不匹配,显然不可能匹配。
dp[i][0]表示p中[1,p.length]个字符和s中0个字符匹不匹配,这要看p中第i个字符是不是'*',这里的'*'表示空字符,'*'表示空字符的话,就看p中前一个字符和s匹不匹配。
for (int i = 1; i <= p.length(); i++) { if(p.charAt(i-1) == '*')dp[i][0] = dp[i-1][0]; }
处理完初始条件后,看之后的字符匹不匹配。
当p[i]是'?'或者p[i]==s[j]时候,就看p[0,i-1]和s[0,j-1]匹不匹配。
if(p.charAt(i-1) == '?' || p.charAt(i-1) == s.charAt(j-1)) dp[i][j] = dp[i-1][j-1];
当p[i]是'*',要看'*'表示的是空字符,还是多个字符。
'*'表示空字符,那么看p[0,i-1]和s[0,j]匹不匹配。如:p=ab*,s=ab,p[0,1]=ab和s[0,1]匹配,'*'匹配0个字符。
'*'表示多个字符,那么看p[0,i]和s[0,j-1]匹不匹配。如:p=ab*,s=abcd。
else if(p.charAt(i-1) == '*'){ dp[i][j] = dp[i][j-1] || dp[i-1][j]; }
-
代码
1 public boolean isMatch(String s, String p) { 2 boolean[][] dp = new boolean[p.length()+1][s.length()+1]; 3 dp[0][0] = true; 4 for (int i = 1; i <= p.length(); i++) { 5 if(p.charAt(i-1) == '*')dp[i][0] = dp[i-1][0]; 6 } 7 8 for (int i = 1; i <= p.length() ; i++) { 9 for (int j = 1; j <= s.length(); j++) { 10 if(p.charAt(i-1) == '?' || p.charAt(i-1) == s.charAt(j-1)) 11 dp[i][j] = dp[i-1][j-1]; 12 else if(p.charAt(i-1) == '*'){ 13 dp[i][j] = dp[i][j-1] || dp[i-1][j]; 14 } 15 } 16 } 17 return dp[p.length()][s.length()]; 18 }