zoukankan      html  css  js  c++  java
  • 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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/wildcard-matching

    解答

    //第10的简化版,dp找规律
    class Solution {
        public boolean isMatch(String s, String p) {
            int s_len = s.length();
            int p_len = p.length();
            boolean[][] res = new boolean[p_len+1][s_len+1];
            res[0][0] = true;
            //初始化第一列
            for(int i=1;i<p_len+1;i++)if(res[i-1][0] && p.charAt(i-1) == '*')res[i][0] = true;
            for(int i=1;i<p_len+1;i++)//每行
                for(int j=1;j<s_len+1;j++){//每列
                    if(p.charAt(i-1) == '*' && (res[i-1][j] || res[i][j-1] || res[i-1][j-1]))res[i][j] = true;
                    else if(p.charAt(i-1) == '?' && res[i-1][j-1])res[i][j] = true;
                    else if(p.charAt(i-1) == s.charAt(j-1) && res[i-1][j-1])res[i][j] = true;
                }
            return res[p_len][s_len];
        }
    }
  • 相关阅读:
    BZOJ2243: [SDOI2011]染色
    BZOJ3747: [POI2015]Kinoman
    BZOJ1293: [SCOI2009]生日礼物
    BZOJ3626 [LNOI2014]LCA
    BZOJ3514 Codechef MARCH14 GERALD07加强版
    BZOJ3295 [CQOI2011]动态逆序对
    BZOJ2588 [SPOJ10628]Count on a tree
    BZOJ1036 [ZJOI2008]树的统计Count
    CODEVS1490 [CTSC2008]网络管理
    BZOJ1070 [SCOI2007]修车
  • 原文地址:https://www.cnblogs.com/xxxxxiaochuan/p/13339719.html
Copyright © 2011-2022 走看看