题解 | #正则表达式匹配#

正则表达式匹配

https://www.nowcoder.com/practice/28970c15befb4ff3a264189087b99ad4

#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    
    /*
        par   ...     j-2               j-1
        str   ...     i-2               i-1
        dp    ...     [i-1, j-1]        [i,j]
    */

    // 注意:
    // . 可以匹配任何字符   , * 前面字符个数可为零;因此,很多情况得考虑上上个结果
    bool match(string str, string pattern) {
        // write code here
        // 使用dp[i][j] 表示str的前i个字符和pattern的前j个字符匹配
        int n1 = str.size();
        int n2 = pattern.size();
        vector<vector<bool>> dp(n1+1, vector<bool>(n2+1, false));

        dp[0][0] = true;    // 匹配对象都为零时,表示匹配成功,直接赋值为true
        for(int j = 2; j <= n2; ++j)
        {
            if(pattern[j-1] == '*')         // * 存在上一个字母出现次数为0情况,因此,
                dp[0][j] = dp[0][j-2];      // 当前情况的匹配与否更多看上上个情况
        }
        for(int i = 1; i <= n1; ++i)
        {
            for(int j = 1; j <= n2; ++j)
            {   
                // 不为 * 情况,只能匹配时当前才会true,因此整体情况看上一次匹配情形
                if(pattern[j-1] != '*' && (pattern[j-1] == '.' || pattern[j-1] == str[i-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];  // * 表示前面字符出现次数为0,则表示当前匹配情况看上上次情况
                }
            }
        }
        return dp[n1][n2];//所有匹配情况,都会汇集到最后一个结果
    }
};

挤挤刷刷! 文章被收录于专栏

记录coding过程

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务