`

Wildcard Matching

阅读更多
Wildcard Matching
给定两个字符串p和q,判断两个字符串是否匹配。规则是:‘*’可以代表任意长度的字符串,也可以代表空串;‘?’代表任意单个的字符串。
例如:
isMatch("aa", "a") → false
isMatch("aa", "aa") → true
isMatch("aaa", "aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false

这是leetcode中一道偏难的题目,我认为它属于LCS的变形,属于二维动态规划的问题。解决它我们主要要分析当前字符能代表什么。既然是二维的动态规划问题,我们创建一个二维的布尔型数组result,如果两个字符串都为空时,返回true,因此result[0][0] = true; 接着我们还要继续初始化数组的第一行,也就是result[0][i],当wildcard的当前字符为‘*’时,result[0][i]= true;当遇到不为’*'我们终止数组的初始化。

接下来我们找出状态转移方程。如果当然字符为’*‘时,我们即可以把它当做空字符也可以让它代替待匹配字符串的从当前字符开始到后面所有的字符,因此此时的动态转移方程为:result[i][j] = result[i - 1][j] || result[i][j - 1],(cur == '*');如果当前字符不为’*'时,如果cur等于待匹配字符串的当前字符或者cur等于’?‘时它们就可以匹配,与此同时,我们还要考虑上一个状态,当(cur != '*') 时的递推式为:result[i][j] = result[i - 1][j - 1] && (cur == '?' || cur == s.charAt(i - 1))。

有了初始化和递推式,代码就写出来了,代码如下:
public class Solution {
    public boolean isMatch(String s, String p) {
        int m = s.length();
        int n = p.length();
        boolean[][] result = new boolean[m + 1][n + 1];
        result[0][0] = true;
        for(int i = 1; i <= n; i++) {
            if(p.charAt(i - 1) == '*')
                result[0][i] = true;
            else
                break;
        }
        for(int i = 1; i <= m; i++) {
            for(int j = 1; j <= n; j++) {
                char cur = p.charAt(j - 1);
                if(cur != '*') {
                    result[i][j] = result[i - 1][j - 1] && (cur == '?' || cur == s.charAt(i - 1));
                } else {
                    result[i][j] = result[i - 1][j] || result[i][j - 1];
                }
            }
        }
        return result[m][n];
    }
}
分享到:
评论

相关推荐

    从代码的视角看DOS时代的通配符.pdf LeetCode 44. Wildcard Matching 正则

    Wildcard Matching Wildcard Matching O(N) by Jimbowhy http://blog.csdn.net/WinsenJiansbomber/article/details/50862569 在 LeetCode 上看到第二个有趣的问题,是关于字符串匹配的,在接触过正则表达式后就...

    Wildcard Matching Functions Library-开源

    标题中的“Wildcard Matching Functions Library-开源”指的是一个专门用于处理字符串和通配符匹配的开源库。这个库可能包含了各种函数,旨在帮助开发者在不同平台上实现字符串与通配符模式的有效比较,例如“*”...

    Coding Interview In Java

    9 Wildcard Matching 37 10 Regular Expression Matching in Java 39 11 Merge Intervals 43 12 Insert Interval 45 13 Two Sum 47 14 Two Sum II Input array is sorted 49 15 Two Sum III Data structure design ...

    js-leetcode题解之44-wildcard-matching.js

    js js_leetcode题解之44-wildcard-matching.js

    squish test

    3. **Object Stability:** The tool supports wildcard matching of object names, allowing for changes between builds without the need to edit every script. This feature is crucial for maintaining the ...

    leetcode刷题列表

    例如,“Wildcard Matching”和“Valid Palindrome II”这类题目要求考虑通配符或特殊字符的存在,增加了问题的复杂性。在处理这类问题时,了解API的使用、忽略字符大小写和字符编码差异是十分重要的。 最后,树...

    Coding Interview in Java

    12. 字符串匹配问题:如Wildcard Matching(通配符匹配)、Flip Game(翻转游戏)等,这些题目要求熟悉字符串处理以及递归回溯等算法。 13. 字符串处理高级问题:如Scramble String(错乱字符串),验证字符串的...

    算法刷题笔记leetcode/lintcode

    - Wildcard Matching(通配符匹配) - Length of Last Word(最后一个单词的长度) - Count and Say(猜数字序列) - **Integer Array**(整型数组操作) - Remove Element(移除元素) - Zero Sum Subarray...

    _leetcode-python.pdf

    - Wildcard Matching: 实现支持'?'和'*'的通配符匹配。 - Jump Game / Jump Game II: 第一个问题要求判断是否能到达数组的最后一个位置,第二个问题要求求出最小跳跃次数到达最后一个位置。 - Permutations / ...

    算法-leetcode-剑指offer上的题很多

    - **通配符匹配(Wildcard Matching)**: 实现通配符‘*’和‘?’匹配。 #### 数组操作 - **查找字符串中的重复元素(Remove Duplicates)**: 从排序数组中删除重复项。 - **两数之和(2 Sum)**: 给定一个整数数组 nums ...

    leetcode中国-leetcode:leetcode刷题

    wildcard matching 动态规划 longest common prefix , 简单 valid number, hard, 用有限自动机 integer to roman ,easy , 模拟 roman to integer ,easy , 模拟 count and say , easy , 模拟 Anagrams 字符串处理,map...

    leetcodepython001-Algorithm:关于数据结构和算法的问题(Leetcode、编程之美和课程作业)

    Wildcard Matching Python 2016/4/1 Hard 051 N-Queens C++ 2016/5/18 Hard 092 Reverse Linked List II Python 2017/11/28 Medium 095 Unique Binary Search Trees Python 2017/11/28 Medium 09

    Leetcode-Solutions:JavaScript 语言的 Leetcode 解决方案

    力码解决方案 Leetcode是一个网站,人们——主要是软件工程师——练习他们的编码技能。 有 800 多个问题(并且还在不断...├── Wildcard Matching │ ├── Readme.md │ └── solution.js ├── Valid Number │

    leetcode中国-oracle:Oracle

    leetcode中国 买卖股票 从easy一直问到hard 数独 从medium的判断是不是valid ...Wildcard Matching 判断source string和pattern string是否match, ?代表任意一个字母,比如 s = "Happy" p = "H?pp?" 这种情况

    leetcode答案-leetcode:算法复盘

    leetcode 答案 算法心得 大纲 解算法 = 思路-&gt;思路验证-&gt;直译-&gt;结果验证 进步 = 解算法-&gt;看高手答案-&gt;临摹-&gt;形成后续TODO ...容易跑偏,要直译,要直译,要直译!...很多都是可以直接求出来的...No.44(wildcard matching) No

    通配符匹配leetcode-Greedy-5:贪婪5

    首先,让我们来看一下“Problem1: Wildcard Matching”。这个问题的核心是实现一个函数,它接受两个参数:一个字符串`s`和一个包含通配符`*`的模式`p`,并判断`s`是否能通过重新排列字符匹配`p`。通配符`*`在这里...

    解决:dubbo找不到dubbo.xsd报错

    - cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'dubbo:application'. - schema_reference.4: Failed to read schema document '...

    wildcard-named:一个小巧易用的实用程序模块,用于使用JavaScript的已命名和未命名通配符来匹配字符串

    import wildcard from "wildcard-named" ; 基本例子 import wildcard from "wildcard-named" ; wildcard ( "//blog.com/page/14" , "//blog.com/page/[digit:page]" ) ; // { 'page': '14' } wildcard ( "abc-123:d2...

    wildcard-string-matching:字符串匹配,其中一个字符串包含通配符 (http

    本话题将深入探讨“wildcard-string-matching”,即带有通配符的字符串匹配问题,主要以Java语言为实现背景。 通配符通常用于表示一个或多个字符,常见的通配符有星号(*)和问号(?)。在字符串匹配中,星号代表零...

Global site tag (gtag.js) - Google Analytics