`
Cwind
  • 浏览: 265477 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
793bb7df-a2a9-312d-8cb8-b66c3af482d1
LeetCode题解
浏览量:53529
社区版块
存档分类
最新评论

LeetCode[动态规划] - #10 Regular Expression Matching

阅读更多

原题链接:#10 Regular Expression Matching

 

要求:

实现正则表达式匹配,支持'.'和'*'。

 

'.'匹配任意单字符。

'*'匹配任何0个或多个之前元素。

 

匹配应当覆盖整个输入字符串,而不仅仅是子串。

 

函数原型:

boolean isMatch(String /* string to check */ s, String /* patterns */ p)

 

例:

isMatch("aa", "a") → false

isMatch("aa", "aa") → true

isMatch("aaa", "aa") → false 

isMatch("aa", ".*") → true

isMatch("ab", ".*") → true

isMatch("aab", "c*a*b") → true

 

难度:困难

 

分析:

仅仅是原题中给出的六个示例的话,考虑采用贪心算法,从patterns字符串的尾部向前扫,对于patterns中的每个字符,在待检测字符串中扫到其所能匹配的最长子串,扫描完毕后判断是否到达待检测字符串的头部即可。使用贪心算法实现的该函数见此。但是该函数在应对如isMatch("aaaa", "ab*a*c*a")时会遇到问题,当扫描a*时便会到达待检字符串头部,产生错误结果,因此贪心算法并不适用。

 

仍然从待检字符串尾部向前扫描,设0≤j<s.length(),考虑对于子串s[j..s.length()-1]能够在正则表达式p找到匹配(match[j])的条件为s[j+1...s.length()-1]匹配且s[j]也能够在pattern中找到匹配。如何判断“s[j]也能够在pattern中找到匹配”呢?需要分两种情况讨论,设i为pattern索引,第一种情况:若p[i]不为'*',则进行单字符判断,当p[i]=='.'或p[i]==s[j]时match[j]成立;第二种情况:p[i]为"*",则match[j]成立的条件为p[i-1]=='.'或p[i-1]==p[j]。另外,在这种情况下若match[j]已经被置为true,就算p[i-1]=='.'||p[i-1]==p[j]不成立也应将其值保持,因为*出现时,其之前元素可以为0个。

 

解决方案:

Java - 340 ms

    

// Dynamic Programming Solution
    public boolean isMatch(String /* string to check */ s, String /* patterns */ p) {
        boolean[] match = new boolean[s.length()+1];
        for(int i=0; i<match.length; i++){
            match[i] = false;
        }
        match[s.length()] = true;
        for(int i=p.length()-1; i>=0; i--){
            if(p.charAt(i)=='*'){
                for(int j=s.length()-1; j>=0; j--){
                    match[j] = match[j]||match[j+1]&&(p.charAt(i-1)=='.'||p.charAt(i-1)==s.charAt(j));
                }
                i--;
            }else {
                for(int j=0; j<s.length(); j++){
                    match[j] = match[j+1]&&(p.charAt(i)=='.'||p.charAt(i)==s.charAt(j));
                }
                match[s.length()] = false;
            }
        }
        return match[0];
    }

 简单测试程序

1
1
分享到:
评论

相关推荐

    js-leetcode题解之10-regular-expression-matching.js

    js js_leetcode题解之10-regular-expression-matching.js

    C语言-leetcode题解之10-regular-expression-matching.c

    c语言入门 C语言_leetcode题解之10-regular-expression-matching.c

    c语言-leetcode 0010-regular-expression-matching.zip

    c c语言_leetcode 0010_regular_expression_matching.zip

    LeetCode题解 - Java语言实现-181页.pdf

    8. Regular Expression Matching in Java 正则表达式匹配是一个字符串问题,要求使用正则表达式来匹配字符串。可以使用Java的Pattern和Matcher类来解决该问题。 9. Merge Intervals 区间合并是一个数组问题,要求...

    分割数组求最大差值leetcode-Leetcode-Road:LeetCode刷题记录

    分割数组求最大差值leetcode LeetCode 学习之路 记录自己完成LeetCode的代码和结果。 序号 中文名称 英文名称 通过率 难度 1 Two Sum 47.0% 简单 2 Add Two Numbers 36.0% 中等 3 Longest Substring Without ...

    leetcode中国-leetcode:leetcode刷题

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

    leetcode正则表达式-DP-7:DP-7

    "Regular Expression Matching"(正则表达式匹配)是另一个涉及字符串处理的复杂问题,它要求编写一个函数来判断一个字符串是否符合给定的正则表达式模式。 在标签中提到的"系统开源"可能意味着这个压缩包中的代码...

    LeetCode-in-Golang:使用 Golang 解答 LeetCode

    35%2☆ ☆27%3☆ ☆24%4☆ ☆ ☆21%5☆ ☆25%6☆ ☆26%7☆24%8☆ ☆13%9Palindrome Number☆35%10Regular Expression Matching☆ ☆ ☆24%:red_heart:11Container With Most Water☆ ☆36%12Integer to R

    leetcode写题闪退-LeetCode:leetcodeOJ

    动态规划,类似于求最大连续和,但这里由于是乘法,还要考虑符号问题。于是需要记录最大与最小值。 Reverse Words in a String C++实现时那个返回值是void也着实让我困惑了好久 Subsets DFS实现,竟然还WA了好几次。...

    leetcode怎么销号-leetcodeAns:leetcode问题的答案python

    10.Regular Expression Matching: 递归的方法:当前正则第二个字符不为'*',很简单,比较当前,两个指针都往右移动即可,继续这样比较。如果为空,则有两种方式,第一种是正则的指针往后移动,字符串的保持不变,另一...

    lrucacheleetcode-luoleet:LeetcodesolutionsbyXinhangLuoandQinghaoDai

    https://leetcode.com/problems/regular-expression-matching/ Regular Expression Matching 100 https://leetcode.com/problems/same-tree/ Same Tree 101 https://leetcode.com/problems/symmetric-tree/ ...

    leetcode2sumc-myLeetCodeReport:我的LeetCode报告

    leetcode 2 sum c myLeetCodeReport 此仓作为春招以及秋招找工作刷题的一个记录吧。 Leetcode # title solution difficulty 1 Two Sum easy 2 Add Two Numbers medium 3 Longest Substring Without Repeating ...

    _leetcode-python.pdf

    - Regular Expression Matching: 给定一个输入字符串和一个模式,实现支持'.'和'*'的正则表达式匹配。 - Container With Most Water: 给定一个数组,其中每个元素代表一个宽度为1的柱子高度,要求找出两个柱子,使得...

    lrucacheleetcode-leetcode-1:leetcode-1

    lru cache leetcode Leetcode Solution 1. Two Sum ...动态规划,列出转换方程即可,注意初值 记T[i][j] = 是否S[0:i]和P[0:j]匹配 再分类讨论,其中pattern *分为0, 1, more三种类型 0: i不变, j+1

    leetcode338-LeetCode:LeetCode刷题总结

    10.Regular Expression Matching 11.Container With Most Water 12.Integer to Roman 13.Roman to Integer 14.Longest Common Prefix (Trie树待完成) 15.3Sum 16.3Sum Closest 17.Letter Combinations of a Phone ...

    Python_leetcode.zip

    "regular-expression-matching.py"考察的是字符串匹配和回溯算法。Python的字符串操作和递归可以构建出复杂的正则表达式匹配算法,帮助解决复杂的文本处理问题。 "palindrome-pairs.py"是关于回文串和字符串匹配的...

    LeetCode题解(java语言实现).pdf

    * Regular Expression Matching in Java:该题目要求匹配字符串和正则表达式,实现方法使用了动态规划算法。 * Merge Intervals:该题目要求合并重叠的区间,实现方法使用了排序和迭代算法。 * Insert Interval:该...

    leetcode530-algorithm:算法

    leetcode 530 ** LeetCode 题目更新 ** 用来记录业余时间所做的算法题目,保持对于数据结构的熟悉。 ** Leetcode 题目列表 005 Longest Palindromic Substring 006 ZigZag Conversion 007 Reverse Integer 008 ...

    leetcode答案-leetcode:leetcode

    leetcode 答案 leet code 这是我的leetcode答案,语言主要是用python。很多算法不是最优,甚至很槽糕,有空就会优化 目前完成了: Two Sum Add Two Numbers Longest Substring Without Repeating Characters Median ...

    LeetCode 刷题汇总1

    * 正则表达式匹配(Regular Expression Matching):实现正则表达式匹配。 * 实现strStr()(Implement strStr()):实现字符串搜索算法。 7. 排序和搜索: * 合并两个排序列表(Merge Two Sorted Lists):合并两...

Global site tag (gtag.js) - Google Analytics