题目

Implement regular expression matching with support for '.' and '*'.

'.' Matches any single character.
'*' Matches zero or more of the preceding element. The matching should cover the entire input string (not partial). The function prototype should be:
bool isMatch(const char *s, const char *p) Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true 题解:
本文及代码引用自:http://harrifeng.github.io/algo/leetcode/regular-expression-matching.html
  • 首先要理解题意:

    • "a"对应"a", 这种匹配不解释了
    • 任意字母对应".", 这也是正则常见
    • 0到多个相同字符x,对应"x*", 比起普通正则,这个地方多出来一个前缀x. x代表的是
      相同的字符中取一个,比如"aaaab"对应是"a*b"
    • "*"还有一个易于疏忽的地方就是它的"贪婪性"要有一个限度.比如"aaa"对应"a*a",
      代码逻辑不能一路贪婪到底
  • 正则表达式如果期望着一个字符一个字符的匹配,是非常不现实的.而"匹配"这个问题,非
    常容易转换成"匹配了一部分",整个匹配不匹配,要看"剩下的匹配"情况.这就很好的把
    一个大的问题转换成了规模较小的问题:递归
  • 确定了递归以后,使用java来实现这个问题,会遇到很多和c不一样的地方,因为java对字符
    的控制不像c语言指针那么灵活charAt一定要确定某个位置存在才可以使用.
  • 如果pattern是"x*"类型的话,那么pattern每次要两个两个的减少.否则,就是一个一个
    的减少. 无论怎样减少,都要保证pattern有那么多个.比如s.substring(n), 其中n
    最大也就是s.length()
代码如下:
 1     public static boolean isMatch(String s, String p) {
 2         if (p.length() == 0)
 3             return s.length() == 0;
 4 
 5         // length == 1 is the case that is easy to forget.
 6         // as p is subtracted 2 each time, so if original
 7         // p is odd, then finally it will face the length 1
 8         if (p.length() == 1)
 9             return (s.length() == 1) && (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.');
 
         // next char is not '*': must match current character
         if (p.charAt(1) != '*') {
             if (s.length() == 0)
                 return false;
             else
                 return (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.')
                         && isMatch(s.substring(1), p.substring(1));
         }else{
             // next char is *
             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));
         }
     }
 

最新文章

  1. css 背景透明文字(内容)不透明三种实现方法
  2. Linux操作系统发展史
  3. saiku 元数据存储分析
  4. LintCode "Subarray Sum II"
  5. Android SDK的docs访问速度很慢(新)
  6. SqlCommand.ExecuteNonQuery()执行查询返回值的问题
  7. HDU 4034 Graph(floyd,最短路,简单)
  8. ARM GCC 内嵌汇编手册
  9. 常见Android面试题及答案(详细整理)
  10. 通过官网找到spring的jar包
  11. [JAVA] - 从 m 个元素中随机选中 n 个
  12. 最新的App上架教程Object-C
  13. 【大数据安全】Apache Kylin 安全配置(Kerberos)
  14. 【POJ 3159】Candies&&洛谷P3275 [SCOI2011]糖果
  15. 洛谷P3209 [HNOI2010]PLANAR(2-SAT)
  16. 演示Thread.sleep(100)和Thread.currentThread().isInterrupted()+@Deprecated:将方法标注为废弃的方法
  17. ldap objectclass
  18. Even and Odd Functions
  19. R语言和RStudio的一些用法,常用命令等
  20. POJ 2234

热门文章

  1. SPFA算法 O(kE)
  2. zoj 3204 最小生成树,输出字典序最小的解
  3. javaSrript_数据类型(2017-03-15)
  4. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) D. Dense Subsequence 暴力
  5. Codeforces Round #374 (Div. 2) C. Journey DP
  6. 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem F. Judging Time Prediction 优先队列
  7. Maven 项目不打包 *.hbm.xml 映射文件
  8. C# 读带复选框的excel,写excel并设置字体、边框、背景色
  9. LPC43xx SGPIO I2C Implementation
  10. A CANBus Tiny Network without Transceiver ICs : STM32F4 Discovery