LeetCode10 Regular Expression Matching

本文介绍了一种使用回溯法解决正则表达式匹配问题的方法。重点在于如何处理特殊字符‘*’的不同情况,通过递归地检查字符串与模式之间的匹配情况来实现。文中提供了一个具体的C/C++函数实现示例。

说是动态规划,实际上是一道回溯暴力搜索。

注意一点就可以了。

*的数量可以是0、1、2、3、4.我们只要遍历出当*是0的时候,后续的组合是不是符合要求的。这样我们才可以满足1之后的情形

bool isMatch(char* s, char* p) {
     if (s == NULL || p == NULL) return false;
     if (*p == '\0') return *s == '\0';
     // ".*" matches "", so we can't check (*s == '\0') here.
  
     if (*(p + 1) == '*')
     {
         // Here *p != '\0', so this condition equals with
         // (*s != '\0' && (*p == '.' || *s == *p)).
         while ((*s != '\0' && *p == '.') || *s == *p)
         {
             if (isMatch(s, p + 2)) return true;
             ++s;
         }
         
         return isMatch(s, p + 2);
     }
     else if ((*s != '\0' && *p == '.') || *s == *p)
     {
         return isMatch(s + 1, p + 1);
     }
     
     return false;

}


LeetCode Problem 10, known as Regular Expression Matching, involves determining if a string matches a given pattern, considering special characters like `.` and `*`. The solution typically requires a recursive approach or dynamic programming to handle the complexities introduced by these special characters. Below is a Java implementation using recursion to solve this problem: ```java public class Solution { public boolean isMatch(String s, String p) { if (s == null || p == null) { return false; } int lenS = s.length(); int lenP = p.length(); if (lenP == 0) { return lenS == 0; } if (lenP == 1) { if (p.equals(s) || p.equals(".")) { return true; } else { return false; } } if (p.charAt(1) == '*') { while (s.length() > 0 && (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.')) { if (isMatch(s, p.substring(2))) { return true; } s = s.substring(1); } return isMatch(s, p.substring(2)); } else { if (s.length() > 0 && (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.')) { return isMatch(s.substring(1), p.substring(1)); } return false; } } } ``` This solution recursively checks for matches by evaluating the current characters and handling the `*` wildcard, which allows for zero or more of the preceding element. The function proceeds by either skipping the current pattern and the next (if the next character is `*`) or by matching the current character and proceeding in both strings. The implementation efficiently breaks down the problem into manageable recursive calls, ensuring all possible matches are explored, especially when dealing with the `*` operator, which introduces backtracking possibilities to find a valid match path[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值