鱼C论坛

 找回密码
 立即注册
查看: 2128|回复: 2

[技术交流] C++刷LeetCode(剑指 Offer 19. 正则表达式匹配)【动态规划】

[复制链接]
发表于 2020-7-4 16:30:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目描述:
  1. 请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。

  2. 示例 1:

  3. 输入:
  4. s = "aa"
  5. p = "a"
  6. 输出: false
  7. 解释: "a" 无法匹配 "aa" 整个字符串。
  8. 示例 2:

  9. 输入:
  10. s = "aa"
  11. p = "a*"
  12. 输出: true
  13. 解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
  14. 示例 3:

  15. 输入:
  16. s = "ab"
  17. p = ".*"
  18. 输出: true
  19. 解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
  20. 示例 4:

  21. 输入:
  22. s = "aab"
  23. p = "c*a*b"
  24. 输出: true
  25. 解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
  26. 示例 5:

  27. 输入:
  28. s = "mississippi"
  29. p = "mis*is*p*."
  30. 输出: false
  31. s 可能为空,且只包含从 a-z 的小写字母。
  32. p 可能为空,且只包含从 a-z 的小写字母以及字符 . 和 *,无连续的 '*'。

  33. 来源:力扣(LeetCode)
  34. 链接:https://leetcode-cn.com/problems/zheng-ze-biao-da-shi-pi-pei-lcof
  35. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码


  1. class Solution {
  2. public:
  3.     bool isMatch(string s, string p) {
  4.         int len1 = s.size(), len2 = p.size();
  5.         if(len2 ==0){
  6.             if(len1 == 0)return true;
  7.             return false;
  8.         }
  9.         if(p[0] == '*')return false;

  10.         vector<vector<bool> > dp(len1 + 1, vector<bool>(len2 + 1, false));
  11.         s = " " + s;
  12.         p = " " + p;
  13.         dp[0][0] = true;
  14.         for(int j = 2; j <= len2; j++){
  15.             if(p[j] == '*')dp[0][j] = dp[0][j-2];
  16.             else dp[0][j] = false;
  17.         }

  18.         for(int i = 1; i <= len1; i++){
  19.             for(int j = 1; j <= len2; j++){
  20.                 if(p[j] != '*')dp[i][j] = dp[i-1][j-1] && (s[i] == p[j] || p[j] == '.');
  21.                 else dp[i][j] = dp[i][j - 2] || dp[i - 1][j] &&(s[i] == p[j-1] || p[j - 1] == '.');
  22.             }
  23.         }
  24.         return dp[len1][len2];

  25.     }
  26. };
复制代码


参考链接:https://leetcode-cn.com/problems ... ie-by-acw_wangdh15/
注意事项:这里二层循环j从1而不是从2开始是因为之前已经判断了p[0]不能等于‘*’,因此虽然j从1开始,但是循环到else是从2开始的。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-4 18:31:29 | 显示全部楼层
相似题目(44. 通配符匹配):

  1. 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。

  2. '?' 可以匹配任何单个字符。
  3. '*' 可以匹配任意字符串(包括空字符串)。
  4. 两个字符串完全匹配才算匹配成功。

  5. 说明:

  6. s 可能为空,且只包含从 a-z 的小写字母。
  7. p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
  8. 示例 1:

  9. 输入:
  10. s = "aa"
  11. p = "a"
  12. 输出: false
  13. 解释: "a" 无法匹配 "aa" 整个字符串。
  14. 示例 2:

  15. 输入:
  16. s = "aa"
  17. p = "*"
  18. 输出: true
  19. 解释: '*' 可以匹配任意字符串。
  20. 示例 3:

  21. 输入:
  22. s = "cb"
  23. p = "?a"
  24. 输出: false
  25. 解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
  26. 示例 4:

  27. 输入:
  28. s = "adceb"
  29. p = "*a*b"
  30. 输出: true
  31. 解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".
  32. 示例 5:

  33. 输入:
  34. s = "acdcb"
  35. p = "a*c?b"
  36. 输出: false
复制代码


  1. lass Solution {
  2. public:
  3.     bool isMatch(string s, string p) {
  4.         int len1 = s.size(), len2 = p.size();
  5.         vector<vector<bool>> dp(len1 + 1, vector<bool>(len2 + 1, false));
  6.         s = " " + s;
  7.         p = " " + p;
  8.         dp[0][0] = true;
  9.         for (int j = 1; j <= len2; j++) {
  10.             if (p[j] == '*') dp[0][j] = dp[0][j-1];
  11.         }
  12.         for (int j = 1; j <= len2; j++) {//注意这里的顺序
  13.             for (int i = 1; i <= len1; i++) {
  14.                 if (p[j] != '*') dp[i][j] = dp[i-1][j-1] && (s[i] == p[j] || p[j] == '?');
  15.                 else dp[i][j] = dp[i-1][j] || dp[i][j-1];
  16.             }
  17.         }
  18.         return dp[len1][len2];
  19.     }
  20. };
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-4 18:32:03 | 显示全部楼层
这道题要之后再好好想想,关于循环的顺序。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-6 19:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表