列表

详情


BM76. 正则表达式匹配

描述

请实现一个函数用来匹配包括'.'和'*'的正则表达式。
1.模式中的字符'.'表示任意一个字符
2.模式中的字符'*'表示它前面的字符可以出现任意次(包含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

数据范围:
1.str 只包含从 a-z 的小写字母。
2.pattern 只包含从 a-z 的小写字母以及字符 . 和 *,无连续的 '*'。
3.
4.


示例1

输入:

"aaa","a*a"

输出:

true

说明:

中间的*可以出现任意次的a,所以可以出现1次a,能匹配上

示例2

输入:

"aad","c*a*d"

输出:

true

说明:

因为这里 c 为 0 个,a被重复一次, * 表示零个或多个a。因此可以匹配字符串 "aad"。

示例3

输入:

"a",".*"

输出:

true

说明:

".*" 表示可匹配零个或多个('*')任意字符('.')

示例4

输入:

"aaab","a*a*a*c"

输出:

false

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 404KB, 提交时间: 2022-03-05

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    bool match(string str, string pattern) {
        // write code here
        //simplify the pattern
//         char compar
        return partMatch(str,pattern, 0,str.length(), 0, pattern.length());
    }
    bool partMatch(string str, string pattern,int str_index,int str_size,int pattern_index,int pattern_size){
        //return situation
        if(str_index==str_size){
            if(pattern_index==pattern_size) return true;
            if(pattern_index==pattern_size-2&&pattern[pattern_index+1]=='*') return true;
            return false;
        }
        if(pattern_index==pattern_size) return false;
        
        //char+char/. no *
        if(str[str_index]==pattern[pattern_index]||pattern[pattern_index]=='.'){
            if(pattern_index<pattern_size-1&&pattern[pattern_index+1]=='*'){
                //find the last same *
                int offset=0;
                while(pattern_index+1+offset<pattern_size-1&&pattern[pattern_index+1+offset]=='*'&&pattern[pattern_index+offset]==pattern[pattern_index]){
                    offset+=2;
                }
                offset-=2;
                return partMatch(str,pattern,str_index+1,str.length(), pattern_index+offset, pattern.length())||partMatch(str,pattern,str_index+1,str.length(), pattern_index+offset+2, pattern.length())||partMatch(str,pattern,str_index,str.length(), pattern_index+offset+2, pattern.length());
            }
            return partMatch(str,pattern,str_index+1,str.length(), pattern_index+1, pattern.length());
        }
        else{
            if(pattern_index<pattern_size-2&&pattern[pattern_index+1]=='*') return partMatch(str,pattern,str_index,str.length(), pattern_index+2, pattern.length());
            return false;
        }
        
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 408KB, 提交时间: 2022-05-31

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    bool match(string str, string pattern) {
        int n1 = str.length();
        int n2 = pattern.length();
        // dp[i][j]表示str[0:i]与pattern[0:j]是否匹配
        vector<vector<bool>> dp(n1+1, vector<bool>(n2+1, false));
        // 边界初始化
        dp[0][0] = true; // 空串匹配
        // 初始化第一行
        for (int i=2; i<=n2; i++){
            // 遇到*
            if (pattern[i-1] == '*')
                dp[0][i] = dp[0][i-2];
        }
        for (int i=1; i<=n1; i++){
            for(int j=1; j<=n2; j++){
                // 当遇到的字符不为*,判断是否匹配
                if(pattern[j-1] != '*' && (pattern[j-1] == str[i-1] || pattern[j-1] == '.'))
                    dp[i][j] = dp[i-1][j-1];
                else if(j>=2 && pattern[j-1] == '*'){
                    // 若前一位字符为.或者字符匹配的
                    if(pattern[j-2] == '.' || pattern[j-2] == str[i-1])
                        dp[i][j] = dp[i][j-2] || dp[i-1][j];
                    else
                        dp[i][j] = dp[i][j-2];
                }
            }
        }
        return dp[n1][n2];
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 408KB, 提交时间: 2022-03-12

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    bool match(string s, string p) {
        int m = s.size(), n = p.size();
        vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
        dp[0][0] = true;
        for (int j = 2; j <= n; j++) {
            if (p[j - 1] == '*')
                dp[0][j] = dp[0][j - 2];
        }
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (s[i - 1] == p[j - 1] || p[j - 1] == '.') {
                    dp[i][j] = dp[i - 1][j - 1];
                }
                else if (p[j - 1] == '*') {
                    if (j > 1) {
                        if (dp[i][j - 2]) dp[i][j] = true;
                        else if (s[i - 1] == p[j - 2] || p[j - 2] == '.') {
                            dp[i][j] = dp[i - 1][j];
                        }
                    }
                }
            }
        }
        return dp[m][n];
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-03-11

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    bool match(string str, string pattern) {
        // write code here
        //dp
        if(pattern.empty()) return str.empty();
        int m = str.size(), n = pattern.size();
        bool dp[m + 1][n + 1];
        memset(dp, 0, sizeof(dp));
        dp[0][0] = 1;
        for(int i = 2; i <= n; i++)
        {
            if(pattern[i - 1] == '*')
                dp[0][i] = dp[0][i - 2];
        }
        
        for(int i = 1; i <= m; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                if(str[i - 1] == pattern[j - 1] || pattern[j - 1] == '.')
                {
                    dp[i][j] = dp[i - 1][j - 1];
                }
                else if(pattern[j - 1] == '*')
                {
                    if(dp[i][j - 1])//*匹配一次
                    {
                        dp[i][j] = dp[i][j - 1];
                    }
                    else if(j >= 2 && dp[i][j - 2])//*匹配0次
                    {
                        dp[i][j] = dp[i][j - 2];
                    }
                    else if(i >= 2 && j >= 2)//可能匹配2次及以上
                    {
                        dp[i][j] = dp[i - 1][j] && (str[i - 1] == pattern[j - 2] || pattern[j - 2] == '.');
                    }
                }
            }
        }
        return dp[m][n];
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-02-28

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    bool match(string str, string pattern) {
        // write code here
        vector<vector<bool>> dp(str.length()+1, vector<bool>(pattern.length()+1));
        dp[0][0] = true;
        for(int i=1; i<str.length()+1; i++){
            dp[i][0] = false;
        }
        for(int j=1; j<pattern.length()+1; j++){
            dp[0][j] = pattern[j-1]=='*' && dp[0][j-2];
            for(int i=1; i<str.length()+1; i++){
                if(pattern[j-1]!='*'){
                    dp[i][j] = (pattern[j-1]==str[i-1] || pattern[j-1]=='.') && dp[i-1][j-1];
                }else{
                    dp[i][j] = dp[i][j-2] || (dp[i-1][j] && (pattern[j-2]==str[i-1] || pattern[j-2]=='.'));
                }
            }
        }
        return dp[str.length()][pattern.length()];
    }
};

上一题