剑指offer-面试题53-正则表达式匹配
来源:互联网 发布:中国运动鞋销售数据 编辑:程序博客网 时间:2024/05/17 03:24
题目:请实现一个函数用来匹配包括'.’和'*'的正则表达式。模式中的字符'.’表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配。分析;常规中,如果是普通的两个字符串,那很简单,我们直接进行对比就可以了,这里又是要求匹配是指字符串的所有字符匹配整个模式,所以只要直接挨个比较就可以了,如果都相等则返回true;否则返回false;可是这个题目来了一个'.'和'*'两个比较烦人的东西,它改变了游戏的规则。把游戏变的复杂多变。
首先要明确'.'确定了字符的个数为1,并且为任意;'*'可以确定它前面的字符的个数包括0次;
第一种情况:当模式的第二个字符不是'*'的时候,如果字符串的第一个字符和模式串的第一个字符相等,则都向后移动一个,匹配剩下的字符串和模式串。如果不等则直接返回false;
第二种情况:当模式的第二个字符是'*'的时候,这时候就稍复杂点儿,因为这时候存在不同的几种匹配方式:以字符串"aaa"与模式"ab*ac*a"匹配为例:
1、如果模式串中的字符和字符串中的字符不等如(a),且模式串的第二个字符为'*'。
选择只有一种:在模式串上向后移动两个字符,忽略掉b和*,因为'*'可以匹配0个字符;如下图:
2、如果模式串中的字符和字符串中的字符相等如(b),或者模式串中为'.'如(c),并且模式串的第二个字符为'*'。其实(b)和(c)是一样的。这时候选择有三种情况:
(1)可以选择在模式串上向后移动两个字符,忽略掉b和*,因为'*'可以匹配0个字符,字符串str保持不变;
(2)可以选择越过'*','*'前的a当作有效的字符,且数量为1,str++;
(3)可以选择模式串pattern不变,因为‘*’前的a可以任意数量的,并且和字符串str相等,只需要str++即可;
具体如下图所示:
代码实现如下:
package case53_RegularExpressionMatching;import java.util.zip.InflaterInputStream;/** * 题目:请实现一个函数用来匹配包含‘.’和‘*’的正则表达式。模式中的字符’.’表示任意一个字符,而‘*’表示它前面的字符可以出现 * 任意次(含0次)。本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串“aaa”与模式“a.a”和“ab*ac*a”匹配,但与 * “aa.a”及“ab*a”均不匹配。 * * 思路:首先要明确'.'确定了字符的个数为1,并且为任意;'*'可以确定它前面的字符的个数包括0次; * * 第一种情况: * * 当模式的第二个字符不是'*'的时候,如果字符串的第一个字符和模式串的第一个字符相等,则都向后移动一个,匹配剩下的字符串和模式 * 串。如果不等则直接返回false; * * * 第二种情况:当模式的第二个字符是'*'的时候,这时候就稍复杂点儿,因为这时候存在不同的几种匹配方式:以字符串"aaa"与模式"ab*ac*a"匹配为例: * * 1、如果模式串中的字符和字符串中的字符不等,且模式串的第二个字符为'*'。 * * 选择只有一种:在模式串上向后移动两个字符,忽略掉b和*,因为'*'可以匹配0个字符; * 2、如果模式串中的字符和字符串中的字符相等,或者模式串中为'.',并且模式串的第二个字符为'*'。这时候选择有三种情况: * * (1)可以选择在模式串上向后移动两个字符,忽略掉b和*,因为'*'可以匹配0个字符,字符串str保持不变; * * (2)可以选择越过'*','*'前的a当作有效的字符,且数量为1,str++; * * (3)可以选择模式串pattern不变,因为‘*’前的a可以任意数量的,并且和字符串str相等,只需要str++即可; * * @author WangSai * */public class RegularExpressionMatching {/** * @param args */public static void main(String[] args) {String input = "aaa";String pattern1 = "a.a";System.out.println(pattern1 + '\t' + "----" + '\t' + myMatch(input, pattern1));String pattern2 = "a*a";System.out.println(pattern2 + '\t' + "----" + '\t' + myMatch(input, pattern2));String pattern3 = "ab*ac*a";System.out.println(pattern3 + '\t' + "----" + '\t' + myMatch(input, pattern3));String pattern4 = "a.aa";System.out.println(pattern4 + '\t' + "----" + '\t' + myMatch(input, pattern4));String pattern5 = "aaa*";System.out.println(pattern5 + '\t' + "----" + '\t' + myMatch(input, pattern5));String pattern6 = "abbbbb*";System.out.println(pattern6 + '\t' + "----" + '\t' + myMatch(input, pattern6));String pattern7 = "aa.b";System.out.println(pattern7 + '\t' + "----" + '\t' + myMatch(input, pattern7));String pattern8 = "a*bbb";System.out.println(pattern8 + '\t' + "----" + '\t' + myMatch(input, pattern8));}private static boolean myMatch(String input, String pattern) {// 异常值检测if (input == null || pattern == null)return false;// 采用递归的方式实现return myMatchCore(input, 0, pattern, 0);}private static boolean myMatchCore(String input, int inputIndex, String pattern, int patIndex) {// 字符串input和模式串pattern同时结束if (inputIndex >= input.length() && patIndex >= pattern.length()) {return true;}// 字符串input未结束,但是模式串pattern结束了if (inputIndex < input.length() && patIndex >= pattern.length()) {return false;}// 模式串pattern未结束,字符串input可能结束了,也可能没结束// 模式串pattern 到达倒数第二个字符,并且下一个字符为‘*’if (patIndex + 1 < pattern.length() && pattern.charAt(patIndex + 1) == '*') {// 字符串input结束了if (inputIndex >= input.length()) {return myMatchCore(input, inputIndex, pattern, patIndex + 2);}// 字符串input和模式串pattern都未结束else {// 当前的pattern[parIndex]值 等于input[inputIndex]的值if (pattern.charAt(patIndex) == input.charAt(inputIndex) || pattern.charAt(patIndex) == '.') {return myMatchCore(input, inputIndex, pattern, patIndex + 2)|| myMatchCore(input, inputIndex + 1, pattern, patIndex + 2)|| myMatchCore(input, inputIndex + 1, pattern, patIndex);}// 当前的pattern[parIndex]值 不 等于input[inputIndex]的值elsereturn myMatchCore(input, inputIndex, pattern, patIndex + 2);}}// 执行到这里说明,匹配串pattern第二个字符不是‘*’,我们可以知道模式串未结束。字符串input可能结束了,也可能没结束// 字符串已经结束if (inputIndex >= input.length()) {return false;}// 字符串未结束,模式串未结束,并且第二个字符不是‘*’else {if (input.charAt(inputIndex) == pattern.charAt(patIndex) || pattern.charAt(inputIndex) == '.')return myMatchCore(input, inputIndex + 1, pattern, patIndex + 1);elsereturn false;}}}
- 剑指offer面试题:正则表达式匹配
- 《剑指Offer》学习笔记--面试题53:正则表达式匹配
- 【剑指Offer学习】【面试题53:正则表达式匹配】
- 剑指offer-面试题53:正则表达式匹配
- 剑指offer--面试题53:正则表达式匹配
- 剑指Offer面试题53:正则表达式匹配 Java实现
- 剑指offer 面试题53:正则表达式匹配
- 剑指offer-面试题53-正则表达式匹配
- 【剑指Offer】面试题53:正则表达式匹配
- 剑指offer面试题53 正则表达式匹配
- 剑指offer--面试题19:正则表达式匹配
- 【剑指offer】面试题19:正则表达式匹配
- 面试题53:正则表达式匹配
- 面试题53:正则表达式匹配
- 面试题53:正则表达式匹配
- 剑指Offer 面试题19:正则表达式匹配 Java代码实现
- 面试题:正则表达式匹配
- 剑指offer 53-正则表达式匹配
- Android launcher3布局和结构
- Android之JNI开发入门
- 线程通信
- 方差、标准差、均方误差、均方差
- 关于句柄的概念
- 剑指offer-面试题53-正则表达式匹配
- mysql如何利用Navicat 导出和导入数据库
- spring classpath和classpath*的区别
- 人民日报点名大数据时代信息隐私安全
- Mahout TF-IDF向量化源码解析
- 关于三目运算符的右结合性
- 特征提取方法(一):HOG原理及OpenCV实现
- 写博客的一点说明
- 超简单的okHttpUtils封装(下)