正則表示式匹配(Regular Expression Matching)
阿新 • • 發佈:2019-01-06
https://leetcode.com/problems/regular-expression-matching/description/
題目大意:給正則表示式p,一個字串s,若正則表示式能匹配成功則為true 否則為false
其中‘*’表示*前的字母可重複0或多次,‘.’可以匹配任意單個字元 例如正則表示式r.t匹配這些字串:rat、rut、r t,但是不匹配root
如 ab a*ab true
aab a*b true
ab .* true
思路1:遞迴:(舉出每一種情況)
#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<limits.h> using namespace std; bool isMatch(string s, string p) { if(p.empty()) return s.empty(); if(p.size()==1) { if((p[0]=='.'||p[0]==s[0])&&s.size()==1) return true; return false; } if(p.size()>1) { if(p[1]!='*'){ if(s.empty()) // a .*..a* return false; //if(p[0]==s[0]||p[0]=='.') // return isMatch(s.substr(1),p.substr(1)); //return false; return (p[0]==s[0]||p[0]=='.')&&isMatch(s.substr(1),p.substr(1)); } if(p[1]=='*'){ while((p[0]==s[0]||p[0]=='.')&&!s.empty()){ // if(s.size()==1) // return true; if(isMatch(s,p.substr(2))) return true; else s=s.substr(1); //此處可能為空,如ab .* 最後是 空 和 .* 遞迴,會返回false,然而應為true //如果堅持這裡用遞迴,添一個if(s.size==1) 那麼b b*b 和 ab .*c無法處理 } return isMatch(s,p.substr(2)); } } } int main(){ string s,p; cin >> s; cin >> p; if(isMatch(s,p)) printf("YES"); else printf("NO"); return 0; }