当前位置:   article > 正文

力扣---通配符匹配

力扣---通配符匹配

题目描述:

给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 '?' 和 '*' 匹配规则的通配符匹配:
'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符序列(包括空字符序列)。
判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。

 
示例 1:

输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。
示例 2:

输入:s = "aa", p = "*"
输出:true
解释:'*' 可以匹配任意字符串。
示例 3:

输入:s = "cb", p = "?a"
输出:false
解释:'?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
 

提示:

0 <= s.length, p.length <= 2000
s 仅由小写英文字母组成
p 仅由小写英文字母、'?' 或 '*' 组成

思路描述:

        对于大多数的字符串的题目,我们都可以使用动态规划来解决。同样,这个题目也可以使用动态规划。

        因为存在两个字符串,因此,我们应该使用二维dp数组,dp[i][j]表示当s字符串的长度为i时,p字符串的长度为j时,此时是否能够匹配上,如果可以,就是true,否则就为false。

        dp[i][j]的取值根据不同的情况,要考虑不同的策略求出,而其的取值必然与dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]的值有关(可以认为是动态规划的一种套路)。

        当p字符串的第j号位置的字符为*时,第一、需要考虑前j-1个位置的子串是否与s的第i元素为结尾的子串是否匹配。第二、需要考虑前j个位置的子串是否与s的第i-1元素为结尾的子串是否匹配。取两者的“或”关系。

        当p字符串的第j号位置的字符为?或者p字符串的第j号位置的字符和s字符串的第i号位置的字符相同时,直接就可以取dp[i-1][j-1]的值。

代码:

  1. class Solution {
  2. public boolean isMatch(String s, String p) {
  3. int m = s.length();
  4. int n = p.length();
  5. boolean[][] dp = new boolean[m + 1][n + 1];
  6. dp[0][0] = true;
  7. for (int i = 1; i <= n; ++i) {
  8. if (p.charAt(i - 1) == '*') {
  9. dp[0][i] = true;
  10. } else {
  11. break;
  12. }
  13. }
  14. for (int i = 1; i <= m; ++i) {
  15. for (int j = 1; j <= n; ++j) {
  16. if (p.charAt(j - 1) == '*') {
  17. dp[i][j] = dp[i][j - 1] || dp[i - 1][j];
  18. } else if (p.charAt(j - 1) == '?' || s.charAt(i - 1) == p.charAt(j - 1)) {
  19. dp[i][j] = dp[i - 1][j - 1];
  20. }
  21. }
  22. }
  23. return dp[m][n];
  24. }
  25. }

提交结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/94922
推荐阅读
相关标签
  

闽ICP备14008679号