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);
            }
            
        }
    };
  • 相关阅读:
    hdu 4334 Trouble
    hdu 4324 Triangle LOVE
    hdu 4255 A Famous Grid
    hdu 3549 Flow Problem
    hdu 3371 Connect the Cities
    hdu 2846 Repository
    hdu 2120 Ice_cream's world I
    P3304 [SDOI2013]直径(【模板】树直径的必经边)
    P5490 【模板】扫描线
    P1364 医院设置(【模板】树的重心)
  • 原文地址:https://www.cnblogs.com/ttzz/p/13966526.html
Copyright © 2011-2022 走看看