刷题10。正規表現のマッチング

I、題する説明

対象は、一見難しいことではありません、10正規表現のマッチングです。

しかし、私は常に与えられて、提出を実現します。答えを見ることを余儀なく。

第二に、私のアプローチ

私は、最大の問題の嘘実現し.*ていない、常に成功し、問題を処理します。

#include<iostream>

using namespace std;

class Solution{
    public:
    bool isMatch(string s,string p){
        bool result = true;
        if(s.length()<=0 && p.length()<=0){
            return true;
        }
        if(p==".*"){
            return true;
        }
        
        int sCurr=0,pCurr=0;
        int lenS = s.length();
        int lenP = p.length();
                
        //count the num of .*
        int numOfWildCard = 0;
        while(pCurr<lenP){
            if(p[pCurr]=='.' && pCurr+1<lenP && p[pCurr+1]=='*'){
                numOfWildCard++;
            }
            
            pCurr++;
        }
        //cout<<numOfWildCard<<":";
        
        pCurr = 0;
        while(sCurr<lenS && pCurr<lenP){
            if((pCurr+1<lenP) && p[pCurr]=='.' && p[pCurr+1]=='*'){
                if(pCurr+2<lenP){
                    pCurr = pCurr+2;
                    while(sCurr<lenS && s[sCurr]!=p[pCurr]){
                        sCurr++;
                    }
                }
                
            }
            if((pCurr+1<lenP) && p[pCurr+1]=='*'){
                while(sCurr<lenS && s[sCurr]==p[pCurr]){
                    sCurr++;
                }
                pCurr = pCurr+2;
            }
            if(sCurr<lenS && pCurr<lenP && p[pCurr+1]!='*'){
                if(s[sCurr]==p[pCurr] || p[pCurr]=='.'){
                    sCurr++;
                    pCurr++;
                }
            }
        }
        
        if(sCurr==lenS && pCurr==lenP){
            result = true;
        }else{
            result = false;
        }
        return result;
    }   
};


int main(){
    Solution s;
    cout<<(false==s.isMatch("aa","a"))<<endl;
    cout<<(true==s.isMatch("aa","a*"))<<endl;
    cout<<(true==s.isMatch("ab",".*"))<<endl;
    cout<<(true==s.isMatch("aab","c*a*b"))<<endl;
    cout<<(false==s.isMatch("mississippi","mis*is*p*."))<<endl;
    return 0;
}

第三に、正しいアプローチ

1.再帰的な方法

#include<iostream>
#include<vector>

using namespace std;

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

int main(){
    Solution s;
    cout<<(false==s.isMatch("aa","a"))<<endl;
    cout<<(true==s.isMatch("aa","a*"))<<endl;
    cout<<(true==s.isMatch("ab",".*"))<<endl;
    cout<<(true==s.isMatch("aab","c*a*b"))<<endl;
    cout<<(false==s.isMatch("mississippi","mis*is*p*."))<<endl;
    cout<<(false==s.isMatch("ab",".*c"))<<endl;
    cout<<(true==s.isMatch("aaa","a*a"))<<endl;
    return 0;
}

2.DP方法

Dpはそれとは何ですか?ダイナミックプログラミング、ああ、

#include<iostream>
#include<vector>
#include <mem.h>

using namespace std;

class Solution {
public:
    bool isMatch(string s, string p) {
        int ssize = s.size(),psize = p.size();
        string pp="";
        vector<bool> star;
        
        for(int i=0;i<p.size();i++){
            if(p[i]=='*'){
                star.back()=true;
            }else{
                star.push_back(false);
                pp+= p[i];
            }
        }
        
        psize = pp.size();
        
        bool dp[psize+1][ssize+1];
        memset(dp,false,sizeof(dp));
        
        dp[0][0] = true;
        for(int i=1;i<=psize;i++){
            if(star[i-1]==true){
                dp[i][0] = true;
            }else{
                break;
            }
        }
        
        for(int i=1;i<=psize;i++)
            for(int j=1;j<=ssize;j++){
                if(dp[i-1][j-1]== true){
                    if(pp[i-1]==s[j-1] || pp[i-1]=='.'){
                        dp[i][j] = true;
                        continue;
                    }
                }
                
                if(dp[i-1][j]== true){
                    if(star[i-1]==true){
                        dp[i][j] = true;
                        continue;
                    }
                }
                
                if(dp[i][j-1]== true){
                    if(star[i-1]==true && (pp[i-1]==s[j-1] || pp[i-1]=='.')){
                        dp[i][j] = true;
                        continue;
                    }
                }
            }
        return dp[psize][ssize];
    }
};

int main(){
    Solution s;
    cout<<(false==s.isMatch("aa","a"))<<endl;
    cout<<(true==s.isMatch("aa","a*"))<<endl;
    cout<<(true==s.isMatch("ab",".*"))<<endl;
    cout<<(true==s.isMatch("aab","c*a*b"))<<endl;
    cout<<(false==s.isMatch("mississippi","mis*is*p*."))<<endl;
    cout<<(false==s.isMatch("ab",".*c"))<<endl;
    cout<<(true==s.isMatch("aaa","a*a"))<<endl;
    cout<<(false==s.isMatch("a",""))<<endl;
    return 0;
}

IVの概要

ブラッシュアップするために必要な基本的な知識が、上に来るようです!

おすすめ

転載: www.cnblogs.com/siweihz/p/12233106.html
おすすめ