1.本题知识点

   字符串、递归

2. 题目描述

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

3. 思路

   这题对编程来说没多大难度,难点是理解题目和考虑全面,总体感觉有点绕。
   首先要明白,字符串和模式串是每个字符依次比较的。而且要弄懂 . 和 * 的意思。

   一、当模式串中的第二个字符不是“*”时(这种情况其实就是将字符依次比较就行了):

   1、当前字符不相同: 直接返回false。
   2、当前字符相同: 即不管是模式串和字符串相等,还是模式串为 . 时,都可以继续递归进入下一轮的匹配。

  二、而当模式串中的第二个字符是“*”时:

   1、当前字符不相同,跳过模式的当前字符和*,继续下一轮匹配。(这是*匹配0次的情况)如图,最终匹配成功:

   2、当前字符相同, 又有两种情况:
   ① 模式后移2字符,相当于x*被忽略(这是*匹配0次的情况)。如图,最终匹配成功:

   ② 模式串不变,字符串后移1位(这是*匹配多次的情况)。如图,最终匹配成功:

   Java版本:
package com.algorithm.str;/*** 请实现一个函数用来匹配包括'.'和'*'的正则表达式。 模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。* 在本题中,匹配是指字符串的所有字符匹配整个模式,则返回true。* 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配* * @author wxq**/
public class MatchPattern {public static void main(String[] args) {String str = "abbbaa";String pattern = "ab*baa";System.out.println(match(str.toCharArray(), pattern.toCharArray()));}/*** 匹配* @param str* @param pattern* @return*/static boolean match(char[] str, char[] pattern) {if (str == null || pattern == null) {return false;}int strIndex = 0;int patternIndex = 0;return matchCore(str, strIndex, pattern, patternIndex);}/*** 可将数组索引看作指针* @param str* @param strIndex* @param pattern* @param patternIndex* @return*/static boolean matchCore(char[] str, int strIndex, char[] pattern,int patternIndex) {// str到尾,pattern到尾,匹配成功if (strIndex == str.length && patternIndex == pattern.length) {return true;}// str没到尾,pattern先到尾,匹配失败if (strIndex != str.length && patternIndex == pattern.length) {return false;}// 模式串第2个字符是*if (patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*') {//递归条件:当前字符相同,或者模式串当前字符为 . if ((strIndex != str.length && pattern[patternIndex] == str[strIndex])|| (strIndex != str.length && pattern[patternIndex] == '.' )) {return matchCore(str, strIndex, pattern, patternIndex + 2)      // 模式串pattern后移2,str指针不变,即x*匹配了0个字符|| matchCore(str, strIndex + 1, pattern, patternIndex);// 模式串pattern指针不变 ,str后移1位}//如果当前字符不相同,则跳过当前模式串的字符和* ,继续下一轮的匹配else{return matchCore(str, strIndex, pattern, patternIndex + 2);}}//模式串第2个字符不是 * ,这种情况其实就依次比较字符即可if (strIndex != str.length) {//字符串和模式串当前字符相同,或者模式串当前字符为 . 时,同时后移1位,继续下一轮的匹配if(pattern[patternIndex] == str[strIndex] || pattern[patternIndex] == '.'){return matchCore(str, strIndex + 1, pattern, patternIndex + 1);}}return false;}
}

字符串之正则表达式匹配相关推荐

  1. python 正则 匹配任意字符串_Python正则表达式匹配字符串中的任意纯数字

    1.使用"\d+"匹配全数字 代码: import re zen = "Arizona 479, 501, 870. Carlifornia 209, 213, 650. ...

  2. Go语言字符串和正则表达式

    字符串相关方法 获取字符串长度 注意: Go语言编码方式是UTF-8,在UTF-8中一个汉字占3个字节 package main import "fmt" func main() ...

  3. 正则表达式匹配的理解

    正则表达式的三步走: Python字符串的转义   -->   正则表达式转义  --> 内容与转义后原始字符串内容进行匹配 import rere.search('\\t','\t'). ...

  4. 正则表达式匹配也可以简单快速(下:实现部分)

    转载请注明译者: phylips@bmy 出处: http://duanple.blog.163.com/blog/static/7097176720099402916150/   实现 Thomps ...

  5. 通配符?子字符串匹配主字符串次数_突破LeetCode,拿BAT大厂offer之《正则表达式匹配》(动态规划)...

    导读:算法哥前面分享了一个<通配符匹配>,有粉丝留言,算法哥你再讲讲leetcode上另一道<正则表达式匹配>,正则表达式匹配这道题是前面通配符匹配的加强版,大家一起来学习吧! ...

  6. 正则表达式匹配不包含特定字符串解决匹配溢出问题

    匹配溢出问题在正则表达式当中算是比较常见的问题,它常常导致我们匹配结果莫名其妙的出错,本文专门为你讲解如何通过匹配不包含特定字符串的方法来解决这类问题. 那么,什么是匹配溢出呢? 下面我们来看个例子: ...

  7. python正则匹配字符串中的数字_Python正则表达式匹配字符串中的数字

    1.使用"\d+"匹配全数字 代码: import re zen = "Arizona 479, 501, 870. Carlifornia 209, 213, 650. ...

  8. leetcode10. 正则表达式匹配 一道没有解释的字符串dp困难题

    给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串  ...

  9. 正则表达式匹配多个字符串中的一个

    正则表达式匹配多个字符串中的一个 当我们采集数据时,会用到正则匹配功能 (前缀)(?<content>[\s\S]*?)(后缀) 例如采集产品多图时,前缀与后缀部分一般情况下是不相同的,这 ...

最新文章

  1. 以太坊(Ethereum)开发框架 Truffle 入门(四):编译合约
  2. SQLServer镜像状态异常排查
  3. 在一个list中增加一个节点
  4. 判断学生成绩(保证其在0-100)c语言
  5. 亿航智能⻓续航⻜机有望在4-8周内首⻜亮相
  6. sqlserver2014导出mysql_sql server2014如何备份数据库-sql server2014备份数据库教程 - 河东软件园...
  7. 【Chromium中文文档】线程
  8. ExtJS Grid中文字链接点击事件的更合理的处理办法
  9. 分享安卓SD卡的后台设置
  10. android 串口CH341驱动,ch341ser驱动安装程序
  11. 韩顺平泰牛php2016,2016 泰牛程序员 韩顺平 PHP 大牛班 Div Css课程
  12. logo字体设计心法
  13. 应用工具推荐phpStudy(小皮面板)
  14. 成功将qt程序移植到arm板上
  15. IC芯片验证 - 手把手教你搭建UVM验证环境
  16. 2020牛客暑期多校训练营(第九场)F.Groundhog Looking Dowdy
  17. vue 活动倒计时组件
  18. 微信 发送图片 服务器上,公安提醒:微信发照片,千万别传原图”!5个步骤教你隐藏位置信息...
  19. 江苏省计算机一级考试试题库,2016年江苏省-计算机一级考试.试题-
  20. 华为od 研发岗一手笔试题

热门文章

  1. Latex引用参考文献的5种方式
  2. 软件项目工作量评估方法简述之COSMIC功能点方法
  3. KS值是衡量分类模型预测准确度的重要指标之一,它反映了模型预测结果与实际数据分布差异的程度。本文将介绍什么是KS值,如何计算以及在Python中如何实现。
  4. 【数据降维】数据降维方法分类
  5. Java在编译到执行过程的编码问题
  6. 如何调整Thinkpad x230的mini DP输出分辨率?
  7. 电脑蓝屏了,错误代码:0x000000CE: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
  8. 【MATLAB】MATLAB矩阵的表示
  9. 台式计算机的辐射程度,台式台式电脑辐射污染标准是多少
  10. vcruntime140_1.dll无法继续执行代码,vcruntime140_1.dll丢失修复方法