44、通配符匹配

  1. 44、通配符匹配
    1. 示例 1:
    2. 示例 2:
    3. 示例 3:
    4. 示例 4:
      1. 示例 5:
  • 题解
    1. 1、动态规划
    2. 2、贪心算法
  • 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'。
    

    示例 4:

    输入:
    s = "adceb"
    p = "*a*b"
    输出: true
    解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".
    

    示例 5:

    输入:
    s = "acdcb"
    p = "a*c?b"
    输入: false
    

    链接:https://leetcode-cn.com/problems/wildcard-matching

    题解

    1、动态规划

    • 有限状态机,分析状态的转换
    • f[i][j] 表示字符串s的前i个字符和模式p的钱j个字符是否能匹配。
    class Solution {
        public boolean isMatch(String s, String p) {
            int m = s.length(),n = p.length();
            boolean[][] f = new boolean[m+1][n+1];// 状态数组,长度多一个元素
            
            // 状态数组初始化
            f[0][0] = true;
            for (int i = 1;i <= n; i++) {
                // 都一层,出现*的时候才是true
                f[0][i] = f[0][i - 1] && p.charAt(i - 1) == '*';
            }
            
            // 枚举所有情况,进行状态更新
            for (int i = 1;i <= m; i++) {
                for (int j = 1;j <= n;j ++) {
                    // 匹配 或者 p[j - 1] = ?
                    if (s.charAt(i - 1) == p.charAt(j - 1) 
                        || p.charAt(j - 1) == '?') {
                        f[i][j] = f[i - 1][j - 1];
                    }
                    // 模式为 *,匹配任意字符串
                    if (p.charAt(j - 1) == '*') {
                        f[i][j] = f[i][j - 1] || f[i - 1][j];
                    }
                }
            }
            return f[m][n];
        }
    }
    

    2、贪心算法

    class Solution {
        // 判断从left到right是否全部为*
        private boolean allStars(String str,int left, int right) {
            for (int i = left;i < right;++i) {
                if (str.charAt(i) != '*') {
                    return false;
                }
            }
            return true;
        }
        // 判断u,v是否匹配
        private boolean charMatch(char u,char v) {
            return u == v || v == '?';
        }
        public boolean isMatch(String s,String p) {
            int sRight = s.length(), pRight = p.length();
            // 循环贪心匹配
            while(sRight > 0 && pRight > 0 && p.charAt(pRight - 1) != '*') {
                if (charMatch(s.charAt(sRight - 1),p.charAt(pRight - 1))) {
                    --sRight;
                    --pRight;
                } else {
                    return false;
                }
            }
            // 是否已完成匹配
            if (pRight == 0) {
                return sRight == 0;
            }
    
            int sIndex = 0,pIndex = 0;
            int sRecord = -1,pRecord = -1;
            while(sIndex < sRight && pIndex < pRight) {
                if (p.charAt(pIndex) == '*') {
                    ++pIndex;
                    sRecord = sIndex;
                    pRecord = pIndex;
                } else if (charMatch(s.charAt(sIndex),p.charAt(pIndex))) {
                    ++sIndex;
                    ++pIndex;
                } else if (sRecord != -1 && sRecord + 1 < sRight) {
                    ++sRecord;
                    sIndex = sRecord;
                    pIndex = pRecord;
                } else {
                    return false;
                }
            }
    
            return allStars(p,pIndex,pRight);
        }
    }
    

    转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com

    💰

    Title:44、通配符匹配

    Count:746

    Author:攀登

    Created At:2020-07-26, 00:19:44

    Updated At:2024-06-15, 15:52:32

    Url:http://jiafeimao-gjf.github.io/2020/07/26/44%E3%80%81%E9%80%9A%E9%85%8D%E7%AC%A6%E5%8C%B9%E9%85%8D/

    Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.

    ×

    Help us with donation