10. Regular Expression Matching

Given an input string (s) and a pattern (p), implement regular expression matching with support for '.' and '*'.

'.' Matches any single character.
'*' Matches zero or more of the preceding element.

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

Note:

  • s could be empty and contains only lowercase letters a-z.
  • p could be empty and contains only lowercase letters a-z, and characters like . or *.

Example 1:

Input:
s = "aa"
p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".

Example 2:

Input:
s = "aa"
p = "a*"
Output: true
Explanation: '*' means zero or more of the precedeng element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".

Example 3:

Input:
s = "ab"
p = ".*"
Output: true
Explanation: ".*" means "zero or more (*) of any character (.)".

Example 4:

Input:
s = "aab"
p = "c*a*b"
Output: true
Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore it matches "aab".

Example 5:

Input:
s = "mississippi"
p = "mis*is*p*."
Output: false


方法一:首先考虑递归解法。

如果p为空,那么表示已经匹配完成,如果此时s还未匹配完则一定无法匹配,反之则匹配成功。

如果p不为空,判断p的第二位是否为‘*’,如果是,分两种情况,第一种是忽略‘*’,s不变,p往后跳2格,递归调用函数。第二种是匹配一格,s前进一格,p不变。

如果p的第二位不为‘*’,则可以直接判断当前位是否相同,然后s、p各进一格递归调用。

注意每次都要判断s是否为空,若为空则返回false。

class Solution {
public:
    bool isMatch(string s, string p) {
        if(p.empty())
            return s.empty();
        if(p[1]=='*')
            return isMatch(s,p.substr(2)) || ( !s.empty() && (s[0]==p[0] || p[0] == '.') && isMatch(s.substr(1),p) ); 
        else
            return !s.empty() && (s[0]==p[0] || p[0] == '.') && isMatch(s.substr(1),p.substr(1));
    } 
};

方法二:动态规划。

其实和方法一思想基本相同,只是把递归转换为了dp数组。

class Solution {
public:
    bool isMatch(string s, string p) {
        if(p.empty())
            return s.empty();
        int len1=s.size(),len2=p.size();
        vector<vector<bool>> dp(len1+1,vector<bool>(len2+1,false));
        dp[0][0]=true;
        for(int i=0;i<=len1;i++)
        {
            for(int j=1;j<=len2;j++)
            {
                if(p[j-1]=='*')
                    dp[i][j] = dp[i][j-2] || ( i>0 && dp[i-1][j] && (s[i-1]==p[j-2] || p[j-2]=='.') );
                else
                    dp[i][j] = i>0 && dp[i-1][j-1] && (s[i-1]==p[j-1] || p[j-1]=='.');
            }
        }
        return dp[len1][len2];
    } 
};





Pattern Matching Using Regular Expression

02-22

A regular expression is a string which contains some normal characters and some meta characters. The meta characters include,n. means any characternn[c1-c2] means any character between c1 and c2 (c1 and c2 are two characters)nn[^c1-c2] means any character not between c1 and c2 (c1 and c2 are two characters)nn* means the character before it can occur any timesnn+ means the character before it can occur any times but at least one timesnn\ means any character follow should be treated as normal characternYou are to write a program to find the leftmost substring of a given string, so that the substring can match a given regular expression. If there are many substrings of the given string can match the regular expression, and the left positions of these substrings are same, we prefer the longest one.nnnInputnnEvery two lines of the input is a pattern-matching problem. The first line is a regular expression, and the second line is the string to be matched. Any line will be no more than 80 character. A line with only an "end" will terminate the input.nnnOutputnnFor each matching problem, you should give an answer in one line. This line contains the string to be matched, but the leftmost substring that can match the regular expression should be bracketed. If no substring matches the regular expression, print the input string.nnnSample Inputnn.*nasdfnf.*d.nsefdfsden[0-9]+nasd345dsfn[^\*-\*]n**asdf**fasdnb[a-z]*r[s-u]*nabcdefghijklmnopqrstuvwxyzn[T-F]ndfkgjfnendnnnSample Outputnn(asdf)nse(fdfsde)nasd(345)dsfn**(a)sdf**fasdna(bcdefghijklmnopqrstu)vwxyzndfkgjf

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试