• 【剑指Offer】52、正则表达式匹配


      题目描述:

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

      解题思路:

      本题不难理解,但是匹配过程中需要考虑的情况比较多,需要谨慎地考虑到每一种情况。

      首先,我们分析如何匹配一个字符,当用一个字符去和模式串中的字符匹配时,如果模式中的字符是'.',那么任何字符都可以匹配;或者,如果两个字符相同,那么可以匹配,接着再去匹配下一个字符。

      相对来说,当模式串的第二个字符不是*,问题比较简单:若字符串的第一个字符和模式串的第一个字符匹配时,字符串和模式串指针都向后移动一个字符,然后匹配剩余的字符串和模式。如果第一个字符不匹配,那么就可以直接返回false。

      当模式串的第二个字符是*,情况就比较复杂,因为可能有多种不同的匹配方式:

    • 无论第一个字符是否相等,模式串向后移动两个字符,相当于*和它前面的字符被忽略,因为*可以代表前面的字符出现0次。
    • 如果模式串第一个字符和字符串第一个字符匹配,则字符串向后移动一个字符,比较下一位,而模式串此时有两种情况:模式串向后移动两个字符,也可以保持模式不变(因为*可以代表前面的字符出现多次)。

      如下图所示,当匹配进入状态2并且字符串的字符是a时,有两种选择:进入状态3或者保持状态2。

      编程实现(Java):

    public class Solution {
        public boolean match(char[] str, char[] pattern){
            /*
            思路:比较前两个字符,递归比较
            */
            if(str==null || pattern==null)
                return false;
            return match(str,0,pattern,0);
        }
        public boolean match(char[] str,int i,char[] pattern,int j){
            if(i==str.length && j==pattern.length)//都为空
                return true;
            if(i<str.length && j==pattern.length)//模式串为空
                return false;
            //以下j一定是<len
            if(j+1<pattern.length && pattern[j+1]=='*'){ //第二个字符是*
                if((i<str.length && str[i]==pattern[j]) ||(i<str.length && pattern[j]=='.') ) //第一个字符相等,有三种情况
                    return match(str,i,pattern,j+2) || match(str,i+1,pattern,j+2) || match(str,i+1,pattern,j);
                    //分别代表匹配0个,1个和多个 
                else //第一个字符不等
                    return match(str,i,pattern,j+2);
            }else{     //第二个字符不是*
                if((i<str.length && str[i]==pattern[j]) || ( pattern[j]=='.'&& i< str.length))
                    return match(str,i+1,pattern,j+1);
                else
                    return false;
            }
            
        }
    }
    
  • 相关阅读:
    剔除数组中重复对象
    2018湖南省高中数学联赛(A)试题
    向量与三角
    阿波罗尼斯圆
    2019高考理科数学(天津卷)
    转载Android常见错误(http://www.cnblogs.com/oklanyan/archive/2011/10/12/2208378.html)
    TCP/IP网络层谜云
    bitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化方法(转载:http://tonyyu.iteye.com/blog/713256)
    ArcGIS for Android 离线数据编辑原理
    Android环境搭建(XP/Win7)转载http://www.cnblogs.com/oklanyan/archive/2011/10/14/2207339.html
  • 原文地址:https://www.cnblogs.com/gzshan/p/10873864.html
Copyright © 2020-2023  润新知