美文网首页
剑指13. 正则表达式

剑指13. 正则表达式

作者: 小幸运Q | 来源:发表于2021-03-03 15:55 被阅读0次

匹配标准

image.png image.png image.png

举个例子

image.png image.png image.png
#include <iostream>
#include<stdlib.h>
#include<string.h>
#include<vector>
using namespace std;
class Solution {
    public:
        bool match(char a,char b){
            if (a==b){
                return true;
            }
            else{
                return false;
            }
        }
        bool isMatch(string s, string p) {
            int lens=s.length(),lenp=p.length();
            int i=0,j=0;

            // 将正则表达式细粒度化 aa*->a,a*,存入vector patterns
            vector<string>patterns;
            while(i!=lenp){
                if(p[i+1]=='*'){
                    patterns.push_back(p.substr(i,2));
                    i++;
                }               
                else if(p[i]=='.'){
                    // 可能只有一个.也可能有.*
                    if(p[i+1]=='*'){
                        patterns.push_back(p.substr(i,2));
                        i++;
                    }
                    else{
                        patterns.push_back(".");
                    }
                }
                else{
                    patterns.push_back(p.substr(i,1));
                }
                i++;
            }

            // 横向向是patterns vector,纵向向下是,尝试从上到下从左到右一路走到目的地
            // nil 与空等价
            bool **maps;
            maps=new bool*[s.length()+1];
            for (i=0;i<=s.length();i++){
                maps[i]=new bool[patterns.size()+1];
            }

            for (i=0;i<=s.size();i++){
                for(j=0;j<=patterns.size();j++){
                    maps[i][j]=false;
                }
            }

            // 初始化dp数组,第一列默认为false(除了第一个元素)因为nil空跟任何单元素匹配都是false
            // 第一行如果是从开头就连续的.*、a*这种为true,其他的单元素则为false
            // 第一行与第一列交汇的地方为true
            maps[0][0]=true;
            i=1;

            while(i<=patterns.size()){
                if(patterns[i-1].length()==2){
                    // .* a* 可以与nil匹配,但是.还有其他单元素不行
                    maps[0][i]=true;
                }
                else{
                    break;
                }
                i++;
            }

            for(i=1;i<=s.length();i++){
                for (j=1;j<=patterns.size();j++){
                    // 左上方为true
                    if(maps[i-1][j-1]==true){
                        if(patterns[j-1].length()==1){
                            // a == a
                            if(patterns[j-1]==s.substr(i-1,1)){
                                maps[i][j]=true;
                            }
                            // a == .
                            else if(patterns[j-1]=="."){
                                maps[i][j]=true;
                            }
                        }
                        else if(patterns[j-1].length()==2){
                            // .*
                            if(patterns[j-1].substr(0,1)=="."){
                                maps[i][j]=true;
                            }
                            // a*==a
                            else if(patterns[j-1].substr(0,1)==s.substr(i-1,1)){
                                maps[i][j]=true;
                            }
                        }
                    }
                    // 上侧为true
                    if(maps[i-1][j]==true){
                        // a* == aaa
                        if(patterns[j-1].length()==2&&patterns[j-1].substr(0,1)==s.substr(i-1,1)){
                            maps[i][j]=true;
                        }
                        // .* == a
                        else if(patterns[j-1].length()==2&&patterns[j-1].substr(0,1)=="."){
                            maps[i][j]=true;
                        }
                    }
                    // 左侧为true
                    if(maps[i][j-1]==true){
                        // a* , .*可以为空
                        if(patterns[j-1].length()==2){
                            maps[i][j]=true;
                        }
                    }
                }
            }
            for(i=0;i<=s.length();i++){
                for(j=0;j<=patterns.size();j++){
                    cout<<maps[i][j]<<" ";
                }
                cout<<endl;
            }
            return maps[s.length()][patterns.size()];
        }
};

int main()
{
    Solution *S=new(Solution);
    cout<<S->isMatch("aa",".*...a*");
}

相关文章

  • 剑指13. 正则表达式

    匹配标准 举个例子

  • 正则表达式匹配

    《剑指offer》面试题19:正则表达式匹配 题目:请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字...

  • 剑指offer第二版-19.正则表达式匹配

    本系列导航:剑指offer(第二版)java实现导航帖 面试题19:正则表达式匹配 题目要求:实现正则表达式中.和...

  • 字符串

    剑指offer所有的题目总结 牛客 正则表达式的匹配 leetcode的题目,解析描述更加全面 https://l...

  • 剑指

    遥望中原九点烟,风云直上七重天。 今朝再向江湖去,一剑流星谁比肩? 2011.10(1488)

  • 剑指

    1. 二维数组中查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照...

  • [剑指offer] 正则表达式匹配

    本文首发于我的个人博客:尾尾部落 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'....

  • 【剑指19】正则表达式匹配

    题目描述: 请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前...

  • 剑指offer | 正则表达式匹配

    正则表达式匹配 请实现一个函数来匹配包含"."和"*"的正则表达式。模式中的字符"."表示任意一个字符,而"*"表...

  • [剑指Offer]正则表达式匹配

    本文首发于我的个人博客Suixin’s Blog原文: https://suixinblog.cn/2019/02...

网友评论

      本文标题:剑指13. 正则表达式

      本文链接:https://www.haomeiwen.com/subject/eueqqltx.html