`
cozilla
  • 浏览: 89312 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

[Leetcode] Wildcard Matching

 
阅读更多
Wildcard MatchingMar 16 '127489 / 29783

Implement wildcard pattern matching with support for '?' and '*'.

'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
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

第一个方法是ok的,采用的dp。

dp[i][j] = 1 表示s[1~i] 和 p[1~j] match。

则:

if p[j] == '*' && (dp[i][j-1] || dp[i-1][j]) 

dp[i][j] =  1 

else p[j] = ? || p[j] == s[i]

dp[i][j] = dp[i-1][j-1];

else dp[i][j] = false;

 

第二个方法:TLE

相比于dp,暴力的方法会多次计算dp[i][j].

其实如果要优化的话,也是非常容易的。只需要记录下 (s,p)是否处理过。

class Solution {
public:

    bool isMatch(const char *s, const char *p) {
        int len_s = strlen(s);
        int len_p = strlen(p);

        const char* tmp = p;
        int cnt = 0;
        while (*tmp != '\0') if (*(tmp++) != '*') cnt++;
        if (cnt > len_s) return false;
        
        bool dp[500][500];
        memset(dp, 0,sizeof(dp));

        dp[0][0] = true;
        for (int i = 1; i <= len_p; i++) {
            if (dp[0][i-1] && p[i-1] == '*') dp[0][i] = true;
            for (int j = 1; j <= len_s; ++j)
            {
                if (p[i-1] == '*') dp[j][i] = (dp[j-1][i] || dp[j][i-1]);
                else if (p[i-1] == '?' || p[i-1] == s[j-1]) dp[j][i] = dp[j-1][i-1];
                else dp[j][i] = false;
            }
        }
        return dp[len_s][len_p];
    }
};


class Solution {
public:
    bool isMatch(const char *s, const char *p) {
        if (*s == '\0' && *p == '\0') return true;
        if (*s != '\0' && *p == '\0') return false;
        if (*s == '\0') {
            if (*p == '*') return isMatch(s, p+1);
            else return false;
        }
        
        if (*p == '*') {
            while (*(p+1) == '*') p++;
            while (*s != '\0') {
                if (isMatch(s, p+1)) return true;
                s++;
            }
            return isMatch(s, p+1);
        }
        else if (*p == '?' || *p == *s)
            return isMatch(s+1, p+1);
        else if (*p != *s) 
            return false;
    }
};

 

分享到:
评论

相关推荐

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

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

    leetcode:解决LeetCode问题的资源库

    wildcard-matchingpackage io.lcalmsky.leetcode. wildcard_matchingclass io.lcalmsky.leetcode. wildcard_matching.Solutiontest io.lcalmsky.leetcode. wildcard_matching.SolutionTest问题清

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

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

    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...

    leetcode答案-leetcode:算法复盘

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

    leetcode中国-oracle:Oracle

    leetcode中国 买卖股票 从easy一直问到hard 数独 从medium的判断是不是valid 到 hard的solve 数独 从BST里面删除一个node (要求写test case) design就是皮毛的问题。。。我几乎就是把Harvard那个intro system design...

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

    通配符匹配leetcode Greedy-5 Problem1: Wildcard Matching () Problem2: Bikes in a Campus ()

    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 ...

    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

    cpp-算法精粹

    Wildcard Matching Longest Common Prefix Valid Number Integer to Roman Roman to Integer Count and Say Anagrams Valid Anagram Simplify Path Length of Last Word Isomorphic Strings Word Pattern 栈和队列 ...

Global site tag (gtag.js) - Google Analytics