一、题目说明

这个题目是10. Regular Expression Matching,乍一看不是很难。

但我实现提交后,总是报错。不得已查看了答案。

二、我的做法

我的实现,最大的问题在于对.*的处理有问题,始终无法成功。

#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;
}

四、总结

看来基础知识还需要恶补,加油!

刷题10. Regular Expression Matching的更多相关文章

  1. leetcode 10 Regular Expression Matching(简单正则表达式匹配)

    最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,pyt ...

  2. Leetcode 10. Regular Expression Matching(递归,dp)

    10. Regular Expression Matching Hard Given an input string (s) and a pattern (p), implement regular ...

  3. leetcode 10. Regular Expression Matching 、44. Wildcard Matching

    10. Regular Expression Matching https://www.cnblogs.com/grandyang/p/4461713.html class Solution { pu ...

  4. 10. Regular Expression Matching字符串.*匹配

    [抄题]: Given an input string (s) and a pattern (p), implement regular expression matching with suppor ...

  5. [LeetCode] 10. Regular Expression Matching 正则表达式匹配

    Given an input string (s) and a pattern (p), implement regular expression matching with support for  ...

  6. leetcode problem 10 Regular Expression Matching(动态规划)

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

  7. LeetCode (10): Regular Expression Matching [HARD]

    https://leetcode.com/problems/regular-expression-matching/ [描述] Implement regular expression matchin ...

  8. 10. Regular Expression Matching

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

  9. 【一天一道LeetCode】#10. Regular Expression Matching

    一天一道LeetCode系列 (一)题目 Implement regular expression matching with support for '.' and '*'. '.' Matches ...

随机推荐

  1. 什么是OOP

    面向对象是相对于面向过程而言的.面向过程语言是一种基于功能分析的.以算法为中心的程序设计方法:而面向对象是一种基于结构分析的.以数据为中心的程序设计思想.早在面向过程语言时代,有一句话说:程序=算法+ ...

  2. 在GPU上训练数据

    在GPU上训练数据 模型搬到GPU上 数据搬到GPU上 损失函数计算搬到GPU上

  3. eclipse的一些使用

    1.恢复默认视图 window->perspective->open perspective ->open java 2.打开其他的一些视图,比如server(tomcat,目前使用 ...

  4. java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!

    问题描述 java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based! 红色部分报错 for ( ...

  5. 手机大厂必备测试技能-GMS 认证

    GMS认证背景 在之前的一篇文章有给各位小伙伴们科普过关于GMS的作用,http://www.lemfix.com/topics/266 "墙"内的小伙伴可能很少会用到这样的服务, ...

  6. .net_DevExpress控件使用经验总结

    (转)DevExpress控件使用经验总结DevExpress是一个比较有名的界面控件套件,提供了一系列的界面控件套件的DotNet界面控件.本文主要介绍我在使用DevExpress控件过程中,遇到或 ...

  7. String类中的equals方法总结(转载)

    转载:https://blog.csdn.net/qq_25827845/article/details/53868815 1.String源码中equals大致写法: public boolean ...

  8. AcWing 913. 排队打水

    #include <iostream> #include <algorithm> using namespace std; typedef long long LL; ; in ...

  9. selenium的鼠标事件操作

    自动化测试过程中,经常会用到鼠标事件,在selenium的action_chains模块的ActionChains定义了鼠标操作的一些事件,要使用ActionChains类中的方法,首先需要对Acti ...

  10. [AGC027E]ABBreviate

    Description AGC027E 给定一个仅由\(AB\)构成的字符串\(S\),给定两个操作,把\(AA\)换成\(B\),和把\(BB\)换成\(A\),问由这个字符串和任意次操作可以得到几 ...