剑指Offer:正则表达式匹配Java/Python

1.题目描述

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

2.算法描述

方法:递归(如果当前的字符匹配了,匹配剩下的字符组成的字符串,还是同样的过程,这就是递归)

首 先 , 扫 描 开 始 , 两 个 指 针 i , , j 初 始 化 为 0 , 分 别 指 向 字 符 串 和 模 式 串 的 第 一 个 字 符 首先,扫描开始,两个指针i,,j初始化为0,分别指向字符串和模式串的第一个字符 i,,j0

递归什么时候结束?

递归结束,说明知道是否匹配成功了,即:
当 同 时 扫 描 到 了 两 个 字 符 串 和 模 式 串 的 末 尾 了 , 这 就 是 匹 配 成 功 了 ! \red{当同时扫描到了两个字符串和模式串的末尾了,这就是匹配成功了!}
当 模 式 串 先 扫 描 到 末 尾 了 , 这 是 说 明 没 有 匹 配 成 功 ! \red{当模式串先扫描到末尾了,这是说明没有匹配成功!}

如何递归?这里弄清楚逻辑关系很重要

如 果 模 式 串 存 在 下 一 个 字 符 , 且 下 个 字 符 是 ∗ : \red{如果模式串存在下一个字符,且下个字符是*:}
        如 果 字 符 串 当 前 字 符 和 模 式 串 当 前 字 符 匹 配 , 则 分 三 种 情 况 : \blue{\ \ \ \ \ \ \ 如果字符串当前字符和模式串当前字符匹配,则分三种情况:}        
            认 为 ∗ 前 面 的 字 符 出 现 0 次 , i 不 变 , j + 2 \green{\ \ \ \ \ \ \ \ \ \ \ 认为*前面的字符出现0次,i不变,j+2}            0i,j+2
            认 为 ∗ 前 面 的 字 符 出 现 1 次 , i + 1 , j + 1 \green{\ \ \ \ \ \ \ \ \ \ \ 认为*前面的字符出现1次,i+1,j+1}            1i+1j+1
            认 为 ∗ 前 面 的 字 符 出 现 多 次 , i + 1 , j 不 变 \green{\ \ \ \ \ \ \ \ \ \ \ 认为*前面的字符出现多次,i+1,j不变}            i+1j
        如 果 字 符 串 当 前 字 符 和 模 式 串 当 前 字 符 不 匹 配 , 则 : \blue{\ \ \ \ \ \ \ 如果字符串当前字符和模式串当前字符不匹配,则:}        
            认 为 ∗ 前 面 的 字 符 出 现 0 次 , i 不 变 , j + 2 \green{\ \ \ \ \ \ \ \ \ \ \ 认为*前面的字符出现0次,i不变,j+2}            0ij+2
如 果 下 个 字 符 不 是 ∗ : \red{如果下个字符不是*:}
        如 果 字 符 串 当 前 字 符 和 模 式 串 当 前 字 符 匹 配 , 则 : \blue{\ \ \ \ \ \ \ 如果字符串当前字符和模式串当前字符匹配,则:}        
            匹 配 下 个 字 符 , i + 1 , j + 1 \green{\ \ \ \ \ \ \ \ \ \ \ 匹配下个字符,i+1,j+1}            i+1j+1
        如 果 字 符 串 当 前 字 符 和 模 式 串 当 前 字 符 不 匹 配 , 则 : \blue{\ \ \ \ \ \ \ 如果字符串当前字符和模式串当前字符不匹配,则:}        
            字 符 串 和 模 式 串 不 匹 配 \green{\ \ \ \ \ \ \ \ \ \ \ 字符串和模式串不匹配}            

3.代码描述

3.1.Java代码

public class Solution {
    public boolean match(char[] str, char[] pattern){
        if (str == null || pattern == null)//有一个是空串 返回false
            return false;
        return matchCore(str, 0, pattern, 0);//递归地匹配
    }
    private boolean matchCore(char[] str, int strIndex, char[] pattern, int patternIndex){
        //如果匹配同时到达末尾,则匹配成功
        if(strIndex == str.length && patternIndex == pattern.length) return true;
        //如果模式串先到达末尾,则匹配不成功
        if(strIndex != str.length && patternIndex == pattern.length) return false;
        /*如果下一个字符是'*'*/
        if(patternIndex+1

3.2.Python代码

# -*- coding:utf-8 -*-
class Solution:
    # s, pattern都是字符串
    def match(self, s, pattern):
        if len(s)==0 and len(pattern)==0:
            return True
        if len(s)!=0 and len(pattern)==0:
            return False
        if len(pattern)>1 and pattern[1]=='*':
            if len(s)>0 and (s[0]==pattern[0] or pattern[0]=='.'):
                return self.match(s[:],pattern[2:]) or self.match(s[1:], pattern[2:]) or self.match(s[1:],pattern[:])
            else:
                return self.match(s, pattern[2:])
        if len(s)>0 and (s[0]==pattern[0] or pattern[0]=='.'):
            return self.match(s[1:], pattern[1:])
        else:
            return False

你可能感兴趣的:(剑指Offer)