剑指offer系列26--正则表达式匹配

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

 1 package com.exe6.offer;
 2 /**
 3  * 【题目】请实现一个函数用来匹配包括’.’和’*‘的正则表达式。模式中的字符’.’表示任意一个字符,
 4  *         而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。
 5  *         例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”aba”均不匹配
 6  * @author WGS
 7  *
 8  */
 9 public class MatchRegString {
10
11     public boolean match(char[] str,char[] pattern){
12         if(str==null ||pattern==null)
13             return false;
14         return matchCore(str,0,str.length,pattern,0,pattern.length);
15     }
16
17     public boolean matchCore(char[] str, int i, int length1, char[] pattern, int j, int length2) {
18         if(i==length1 && j==length2){
19             return true;
20             /*if(j==length2 || pattern[j]==‘*‘){
21                 return true;
22             }else{
23                 return false;
24             }*/
25         }
26         if(i!=length1 && j==length2){
27             return false;
28         }
29         //3 当pattern中下一个字符有‘*‘时
30         if(j+1<length2 && pattern[j+1]==‘*‘){
31             //① a A a与a A * a  即*前值与str中要比较的值相同
32             //   a A a与a . * a
33             if(str[i]==pattern[j]){
34                 //后移两位
35                 return matchCore(str,i+1,length1,pattern,j+2,length2)
36                 //在原状态
37                 ||     matchCore(str,i+1,length1,pattern,j,length2)
38                 //忽略
39                 ||     matchCore(str,i+1,length1,pattern,j+2,length2);
40             }
41             //②a A a与a B * a  即*前值与str中要比较的值不同 pattern就忽略*前的值,后移两位继续比较,str 值不变
42             else{
43                 return matchCore(str,i,length1,pattern,j+2,length2);
44             }
45         }
46
47         //1 2 当前字符匹配或者匹配‘.‘ 两者均右移一位继续比较;
48         if(i<length1 && (str[i]==pattern[j] || pattern[j]==‘.‘)){
49             return matchCore(str,i+1,length1,pattern,j+1,length2);
50         }
51         return false;
52     }
53
54     public static void main(String[] args) {
55         char[] str=new char[]{‘a‘, ‘a‘, ‘a‘};
56         char[] pattern=new char[]{‘a‘, ‘b‘,‘*‘,‘a‘, ‘c‘,‘*‘,‘a‘};
57         MatchRegString m=new MatchRegString();
58         boolean b=m.match(str, pattern);
59         System.out.println(b);
60
61     }
62
63 }
时间: 2024-08-09 10:02:34

剑指offer系列26--正则表达式匹配的相关文章

《剑指offer》:[53]正则表达式匹配

题目:请实现一个函数用来匹配包括'.'和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次).在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配. 分析:常规中,如果是普通的两个字符串,那很简单,我们直接进行对比就可以了,这里又是要求匹配是指字符串的所有字符

剑指offer 52.字符串 正则表达式匹配

题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 解题思路 解这题需要把题意仔细研究清楚,反正我试了好多次才明白的.   首先,考虑特殊情况:   1&

剑指offer系列——26.二叉搜索树与双向链表??

Q:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. T:利用一个栈实现二叉树的中序遍历,题中说这是一颗二叉树,那么二叉树的中序遍历是一个有顺序的,? 那么这个时候只需要在中序遍历的时候当找到一个遍历节点的时候先将这个节点保存起来,然后遍历下一个节点的时候将之前保存的节点的right域指向下一个结点,下一个结点的left域指向上一个结点.这样一来就形成了一个排序的双向链表.然后将之前指向保存的指针指向当前这个结点. //递归版 p

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.

剑指offer 面试26题

面试26题: 题目:树的子结构 题:输入两棵二叉树A和B,判断B是不是A的子结构. 解题思路:递归,注意空指针的情况. 解题代码: # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def HasSubtree(self, pRoot1, pRoot2): # write co

剑指offer系列4:斐波那契数列

剑指offer第九题,这个题很古老了.第一个想到的肯定是递归,很简单. 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 class Solution { 5 public: 6 int Fibonacci(int n) { 7 if (n == 0) 8 { 9 return 0; 10 } 11 if (n==1||n==2) 12 { 13 return 1; 14 } 15 else 16 {

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

剑指offer系列47:堆成的二叉树

这个题的主要思路是: 用二叉树的左子树的右子树和右子树的左子树比较,再用左子树的左子树和右子树的右子树比较.(好像有点绕,但其实就是堆成的思想) 剑指offer的说法是用数的前序遍历的两个方法,前序遍历应该是:根->左->右.但是我们用另一种前序遍历:根->右->左.如果这两个序列一样就判断它是对称的. 这两个方法在实现上其实是一样的. 1 class Solution { 2 public: 3 bool isSymmetrical(TreeNode* pRoot) 4 { 5

剑指offer系列——48.不用加减乘除做加法

Q:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. T: 1.使用进制. 两个数异或:相当于每一位相加,而不考虑进位: 两个数相与,并左移一位:相当于求得进位: 将上述两步的结果相加 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2. 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果. 第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12. 同样我们可以用三步走的方