一、题目说明

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

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

二、我的做法

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

  1. #include<iostream>
  2. using namespace std;
  3. class Solution{
  4. public:
  5. bool isMatch(string s,string p){
  6. bool result = true;
  7. if(s.length()<=0 && p.length()<=0){
  8. return true;
  9. }
  10. if(p==".*"){
  11. return true;
  12. }
  13. int sCurr=0,pCurr=0;
  14. int lenS = s.length();
  15. int lenP = p.length();
  16. //count the num of .*
  17. int numOfWildCard = 0;
  18. while(pCurr<lenP){
  19. if(p[pCurr]=='.' && pCurr+1<lenP && p[pCurr+1]=='*'){
  20. numOfWildCard++;
  21. }
  22. pCurr++;
  23. }
  24. //cout<<numOfWildCard<<":";
  25. pCurr = 0;
  26. while(sCurr<lenS && pCurr<lenP){
  27. if((pCurr+1<lenP) && p[pCurr]=='.' && p[pCurr+1]=='*'){
  28. if(pCurr+2<lenP){
  29. pCurr = pCurr+2;
  30. while(sCurr<lenS && s[sCurr]!=p[pCurr]){
  31. sCurr++;
  32. }
  33. }
  34. }
  35. if((pCurr+1<lenP) && p[pCurr+1]=='*'){
  36. while(sCurr<lenS && s[sCurr]==p[pCurr]){
  37. sCurr++;
  38. }
  39. pCurr = pCurr+2;
  40. }
  41. if(sCurr<lenS && pCurr<lenP && p[pCurr+1]!='*'){
  42. if(s[sCurr]==p[pCurr] || p[pCurr]=='.'){
  43. sCurr++;
  44. pCurr++;
  45. }
  46. }
  47. }
  48. if(sCurr==lenS && pCurr==lenP){
  49. result = true;
  50. }else{
  51. result = false;
  52. }
  53. return result;
  54. }
  55. };
  56. int main(){
  57. Solution s;
  58. cout<<(false==s.isMatch("aa","a"))<<endl;
  59. cout<<(true==s.isMatch("aa","a*"))<<endl;
  60. cout<<(true==s.isMatch("ab",".*"))<<endl;
  61. cout<<(true==s.isMatch("aab","c*a*b"))<<endl;
  62. cout<<(false==s.isMatch("mississippi","mis*is*p*."))<<endl;
  63. return 0;
  64. }

三、正确的做法

1.递归方法

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. class Solution{
  5. public:
  6. bool isMatch(string s, string p) {//aa a
  7. if(p.empty()) return s.empty();
  8. if(s.empty()) return p.empty() || (p[1] == '*' ? isMatch(s, p.substr(2)) : false);
  9. if(p[0] != '.' && s[0] != p[0]) return p[1] == '*' ? isMatch(s, p.substr(2)) : false;
  10. if(p[1] == '*') return isMatch(s.substr(1), p) || isMatch(s, p.substr(2));
  11. return isMatch(s.substr(1), p.substr(1));
  12. }
  13. };
  14. int main(){
  15. Solution s;
  16. cout<<(false==s.isMatch("aa","a"))<<endl;
  17. cout<<(true==s.isMatch("aa","a*"))<<endl;
  18. cout<<(true==s.isMatch("ab",".*"))<<endl;
  19. cout<<(true==s.isMatch("aab","c*a*b"))<<endl;
  20. cout<<(false==s.isMatch("mississippi","mis*is*p*."))<<endl;
  21. cout<<(false==s.isMatch("ab",".*c"))<<endl;
  22. cout<<(true==s.isMatch("aaa","a*a"))<<endl;
  23. return 0;
  24. }

2.DP方法

dp是什么?动态规划啊,

  1. #include<iostream>
  2. #include<vector>
  3. #include <mem.h>
  4. using namespace std;
  5. class Solution {
  6. public:
  7. bool isMatch(string s, string p) {
  8. int ssize = s.size(),psize = p.size();
  9. string pp="";
  10. vector<bool> star;
  11. for(int i=0;i<p.size();i++){
  12. if(p[i]=='*'){
  13. star.back()=true;
  14. }else{
  15. star.push_back(false);
  16. pp+= p[i];
  17. }
  18. }
  19. psize = pp.size();
  20. bool dp[psize+1][ssize+1];
  21. memset(dp,false,sizeof(dp));
  22. dp[0][0] = true;
  23. for(int i=1;i<=psize;i++){
  24. if(star[i-1]==true){
  25. dp[i][0] = true;
  26. }else{
  27. break;
  28. }
  29. }
  30. for(int i=1;i<=psize;i++)
  31. for(int j=1;j<=ssize;j++){
  32. if(dp[i-1][j-1]== true){
  33. if(pp[i-1]==s[j-1] || pp[i-1]=='.'){
  34. dp[i][j] = true;
  35. continue;
  36. }
  37. }
  38. if(dp[i-1][j]== true){
  39. if(star[i-1]==true){
  40. dp[i][j] = true;
  41. continue;
  42. }
  43. }
  44. if(dp[i][j-1]== true){
  45. if(star[i-1]==true && (pp[i-1]==s[j-1] || pp[i-1]=='.')){
  46. dp[i][j] = true;
  47. continue;
  48. }
  49. }
  50. }
  51. return dp[psize][ssize];
  52. }
  53. };
  54. int main(){
  55. Solution s;
  56. cout<<(false==s.isMatch("aa","a"))<<endl;
  57. cout<<(true==s.isMatch("aa","a*"))<<endl;
  58. cout<<(true==s.isMatch("ab",".*"))<<endl;
  59. cout<<(true==s.isMatch("aab","c*a*b"))<<endl;
  60. cout<<(false==s.isMatch("mississippi","mis*is*p*."))<<endl;
  61. cout<<(false==s.isMatch("ab",".*c"))<<endl;
  62. cout<<(true==s.isMatch("aaa","a*a"))<<endl;
  63. cout<<(false==s.isMatch("a",""))<<endl;
  64. return 0;
  65. }

四、总结

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

刷题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. django实现简易登录注册

    经过一些文档的理解,以及一些时间的琢磨.我觉得可以用django做一些小项目了 先说说登录功能吧. 先创建一个app,用admin命令 在cmd打开到manage.py同级目录下,django-adm ...

  2. 你所不知道的locust

    from locust import HttpLocust, TaskSet, task import uuid, time import logging,json # https://docs.lo ...

  3. 超简单的OpenGL & WebGL & Three.js介绍_1

    专业解释 什么是OpenGL OpenGL(Open Graphics Library即开放图形库或者“开放式图形库”)是用于渲染2D.3D矢量图形的跨语言.跨平台的应用程序编程接口(API). 这个 ...

  4. 字符串匹配算法--暴力匹配(Brute-Force-Match)C语言实现

    一.前言 暴力匹配(Brute-Force-Match)是字符串匹配算法里最基础的算法,虽然效率比较低,但胜在方便理解,在小规模数据或对时间无严格要求的情况下可以考虑. 二.代码 #include & ...

  5. C++-CodeForces-1313A

    真的打起比赛来,连个贪心都写不好,呜呜呜. #include <bits/stdc++.h> using namespace std; ],t,ans; void IF(int&a ...

  6. Python调用cmd命令

    常用的两种方式: 1.python的OS模块. OS模块调用CMD命令有两种方式:os.popen(),os.system(). 都是用当前进程来调用. os.system是无法获取返回值的.当运行结 ...

  7. 后端——框架——缓存框架——memcached——《Memcached教程》阅读笔记

    Memcached的知识点大致可以分为三个部分. 服务器部分:环境搭建. 概念:存储的数据类型,指令,内存的替换策略. 集成:与Java语言的集成. 1.搭建环境 1.1 Linux环境 在Linux ...

  8. 生产环境实践:Cana实现MySQL到ES实时同步

    注:由于文章篇幅有限,完整文档可扫下面二维码免费获取,更有深受好评的大数据实战精英+架构师好课等着你. 速点链接加入高手战队:http://www.dajiangtai.com/course/112. ...

  9. python UI自动化之切换iframe

    python+selenium写UI自动化的时候,经常会遇到需要切换iframe的情况,这里介绍几种切换iframe的方式 1.使用id定位 driver.switch_to.frame(" ...

  10. CAD

    文件另存为——Autocad.doc.SaveAs   一.前言 使用pyautocad编辑好cad图纸后,往往涉及到一个保存的问题,但是官方文档并未提及,所以只能自己来了,测试了好久,终于是找到了保 ...