zoukankan      html  css  js  c++  java
  • 剑指offer:正则表达式匹配

    题目描述

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

    输入

    "aaa","a*a"

    返回值

    true

    C++实现:解决了好久,需要考虑好多种情况
    首先:
    1.如果*str == *parttern 或者*parttern==‘.’,往下走
    2.str=""和pattern=".*"返回true
    3.
    *str != *parttern 但是*(parttern+1) == ‘*’即这个不相等的字符出现0次,那么就可以令parttern向后走两个位置

    4.不好解决的情况,判断*重复前面对应字符的个数,比如“aaaab”与“aa*b”,中间的a就重复了3次。
    5."bcbbabab",".*a*a" 和 "bbbbba",".*a*a"等情况
    
    
    class Solution {
    public:
    bool match(char* str, char* pattern)
        {
            while(*str!=''||*pattern!=''){
                //为了解决"bcbbabab",".*a*a" 和 "bbbbba",".*a*a"等情况(解决了好久)
                if(*(pattern - 1) == '.'&& *pattern == '*'){
                    if(*(str - 1) != *str && *(str+1)!='')
                        if(*(pattern + 1) == '')
                            return false;
                        else
                            pattern++;
                }
                if(*str == *pattern || (*str!=''&&*pattern == '.')){ //如果匹配,则都向后移动一位
                    str++;
                    pattern++;
                }else if(*pattern == '*'){
                    if(*str=='')//str已经匹配完成,返回true,"aaa","a*a"
                        return true;
                    else{
                        --pattern;
                        //判断是继续循环还是pattern跳到下一个(解决了好久)
                        if(*str == *pattern || (*str!=''&&*pattern == '.')){
                            str++;
                            pattern++;
                        }else{
                            pattern+=2;
                        }
                    }
                }else if(*++pattern=='*'){//虽然不匹配但是可以让该字符出现0次,然后pattern向后走
                    pattern++;
                }else{
                    return false;
                }
            }
            return true;
        }
    };

    还是应该把几种情况想到然后写递归比较简洁

    class Solution {
    public:
    bool match(char* str, char* pattern)
        {
            if(*str == '' && *pattern== '')
                return true;
            if(*str != '' && *pattern == '')
                return false;
            if(*(pattern+1) != '*'){
                if(*str == *pattern || (*str != '' && *pattern == '.'))
                    return match(str+1,pattern+1);
                else{
                    return false;
                }
            }else{
                if (*str == *pattern || (*str != '' && *pattern == '.'))
                    return match(str, pattern+2) || match(str+1, pattern);
                else
                    return match(str, pattern+2);
            }
            
        }
    };
  • 相关阅读:
    Linux多线程Pthread学习小结
    TCP三次握手/四次挥手
    内存管理内幕
    Delphi 中分发设计时包
    一个小的算法问题解决
    写了一个验证数字范围的正则表达式
    用 XML 文件持久化和恢复图片信息
    string.Empty 和 "" 并不总是可以互换的
    博客园用的 FreeTextBox 有 bug
    乱花渐欲迷人眼。。。
  • 原文地址:https://www.cnblogs.com/ttzz/p/13966526.html
Copyright © 2011-2022 走看看