Hard-题目51:44. Wildcard Matching

转载 2016年05月31日 23:57:54

题目原文:
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
题目大意:
实现含有通配符的正则匹配。
题目分析:
这次不能用java的matches函数水过去,就参考一下discuss中大神的解法吧!
众所周知正则匹配默认是贪婪匹配,所以本题也跟贪心有关系。
原文:
Loop
keep two pointers in S and P here i and j
if S[i] == P[j] or P[j] == ‘?’ we keep moving
if ‘*’ exist in P then we mark the position in P as star and mark position in s as s_star
Loop over s until S[i] == P[star + 1] otherwise False
理解如下:两个指针i和j分别从s和p开始,如果s[i]==p[j]或者p[j]==’?’则I,j同时往右推,如果p[j]是’*’,那么记录下当前I,j的位置分别为sstar和star,然后令j指向star+1,sstar一直向后推,直到新的s[i]==p[j]||p[j]==’?’出现(举例:s=”aaaaaaaaaaaaaaaabbbbbb”,t=”a*b*,遇到第一个*的时候j指向b,i如果是a就一直向后推,直到遇见b或’?’为止,遇到其他字符则匹配错误)就好理解了。
要注意的是,*可以多次出现,如果s扫完了p后面还有’*’则也是true,如果出现了其他字符则错误。

源码:(language:python)

class Solution(object):
    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        i = 0
        j = 0
        star = -1
        s_star = 0
        s_len = len(s)
        p_len = len(p)
        while i < s_len:
            if i < s_len and j < p_len and (s[i] == p[j] or p[j] == '?'):
                i += 1
                j += 1
            elif j < p_len and p[j] == '*':
                star = j
                s_star = i
                j += 1
            elif star != -1:
                j = star + 1
                s_star += 1
                i = s_star
            else:
                return False
        while j < p_len and p[j] == '*':
            j += 1
        return j == p_len

成绩:
116ms,85.49%,124ms,7.50%
cmershen的碎碎念:
本算法也不是很难理解,但是对于*的处理确实很巧妙。这道题似乎还有一种基于DP的解法。

【LeetCode】Wildcard Matching 串匹配 动态规划

题目:Wildcard Matching /*LeetCode WildCard matching * 题目:给定一个目标串和一个匹配串,判定是否能够匹配 * 匹配串中的定义:字符————>字符...
  • u011955072
  • u011955072
  • 2015年03月28日 23:24
  • 1549

OCP-1Z0-051-题目解析-第44题

44. View the Exhibit and examine the structure of the ORD table.  Evaluate the following SQL st...
  • wjx515628
  • wjx515628
  • 2014年06月30日 21:17
  • 1257

Makefile编译目录下多个文件以及函数wildcard用法

编译多个c文件一般有两个功能,一个是每个c文件都有main函数,就是说每个c文件的可执行文件是独立的,各自是各自的;第二个是多个c文件用来编译成一个可执行文件。 首先说第一个,内容如...
  • hunanchenxingyu
  • hunanchenxingyu
  • 2013年09月30日 19:15
  • 17855

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

  • 2016年03月12日 03:10
  • 435KB
  • 下载

Leetcode 44. Wildcard Matching

44. Wildcard Matching Total Accepted: 52808 Total Submissions: 307806 Difficulty: Hard Implem...
  • fantasiasango
  • fantasiasango
  • 2016年03月17日 11:47
  • 208

LeetCode_44---Wildcard Matching

Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...
  • bingbing8219
  • bingbing8219
  • 2015年06月19日 15:58
  • 245

44. Wildcard Matching

此道题目,我一开始用的是递归,发现超时,然后就用了二维DP,发现还是超时,最后加了一点trick,勉强才过,不过时间复杂度很高。最理想的方法应该是贪心加回溯。算法思想如下。 Analysis: ...
  • wusecaiyun
  • wusecaiyun
  • 2015年07月23日 17:10
  • 276

[LeetCode]44. Wildcard Matching 深入浅出讲解和代码示例

本题是模式匹配问题,解题思路涵盖了递归、以及匹配算法的知识点
  • karen0310
  • karen0310
  • 2017年07月19日 14:24
  • 73

Leetcode #44. Wildcard Matching 通配符匹配 解题报告

1 解题思想嗯,最近遇到要写Hard的频率偏高,而最近的重心也不再Leetcode上,心累。。Hard写起来都好麻烦。这道题好像之前也有几次,讲过类似的题目,也就是*能任意长度和字符匹配,?能匹配任意...
  • MebiuW
  • MebiuW
  • 2016年04月15日 23:16
  • 1460

LeetCode_OJ【44】Wildcard Matching

Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character....
  • hb_peng
  • hb_peng
  • 2016年01月14日 17:34
  • 195
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hard-题目51:44. Wildcard Matching
举报原因:
原因补充:

(最多只允许输入30个字)