10. Regular Expression Matching LeetCode题解

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

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", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true

Subscribe to see which companies asked this question.

题意:

实现支持'.'和'*'的正则表达式匹配;

其中'.'匹配任意单个字符;

'*'匹配在*之前的那个字符,0次或多次;

比如“aaa"与”.*"是匹配的;


题解:

动态规划的思想

f[i][j]表示s前i个字符与p的前j个字符匹配

case1:s[i] == p[j]

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

case 2: p[i] == '.'

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

case 3: p[i] == '*'

      case31: s[i] != p[j - 1] && p[j - 1] != '.'

f[i][j] = f[i][j - 2];  // s*匹配0次(当做不存在)

      case32: (else)

f[i][j] = f[i - 1][j] ||  // s*匹配多次

  f[i][j - 1] ||   // s*匹配一次

  f[i][j - 2];    // s*匹配0次(当做空)


Code【Java】

public class Solution {
    public boolean isMatch(String s, String p) {
        if (s == null || p == null) {
            return false;
        }
        // 动规数组初始化
        s = " " + s;
        p = " " + p;
        boolean[][] f = new boolean[s.length()][p.length()];
        f[0][0] = true;
        for (int i = 1; i < f[0].length; ++i) {
            f[0][i] = (p.charAt(i) == '*') && f[0][i - 2];
        }
        // 匹配过程
        for (int i = 1; i < s.length(); ++i) {
            for (int j = 1; j < p.length(); ++j) {
                if (s.charAt(i) == p.charAt(j) || p.charAt(j) == '.') {
                    f[i][j] = f[i - 1][j - 1];
                }
                if (p.charAt(j) == '*') {
                    if (s.charAt(i) != p.charAt(j - 1) && p.charAt(j - 1) != '.') {
                        f[i][j] = f[i][j - 2];
                    }
                    else {
                        f[i][j] = (f[i - 1][j] || f[i][j - 1] || f[i][j - 2]);
                    }
                }
            }
        }
        return f[s.length() - 1][p.length() - 1];
    }
}

Code【C++】

class Solution {
public:
    bool isMatch(string s, string p) {
        // 动规数组初始化
        s = s.insert(0, " ");
        p = p.insert(0, " ");
        vector<vector<bool> > f(s.length(), vector<bool>(p.length(), false));
        f[0][0] = true;
        for (int i = 1; i < f[0].size(); ++i) {
            f[0][i] = (p[i] == '*') && f[0][i - 2];
        }
        // 匹配过程
        for (int i = 1; i < s.size(); ++i) {
            for (int j = 1; j < p.size(); ++j) {
                if (s[i] == p[j] || p[j] == '.') {
                    f[i][j] = f[i - 1][j - 1];
                }
                if (p[j] == '*') {
                    if (s[i] != p[j - 1] && p[j - 1] != '.') {
                        f[i][j] = f[i][j - 2];
                    }
                    else {
                        f[i][j] = (f[i - 1][j] || f[i][j - 1] || f[i][j - 2]);
                    }
                }
            }
        }
        return f[s.length() - 1][p.length() - 1];
    }
};


猜你喜欢

转载自blog.csdn.net/baidu_23318869/article/details/71916426