10.正则表达式匹配

刚开始很奇怪为什么这个题的标签是困难,然后写了出来发现我写出来的只针对从头到尾都一样,而不是如示例4,可以匹配一部分。

示例 4:

输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。

只针对从头到尾相同的字符串的程序奉上,可能会有用,本题中通过了  357 / 447 个测试用例

class Solution {
public:
    bool isMatch(string s, string p) {
        bool Match=true;
        int i=0,j=0;   //表示匹配到当前的第i/j个位置
        int lens=s.length(),lenp=p.length();
        while(i<lens || j<lenp){
            if(p[j]=='.' || p[j]==s[i]){  //匹配任意单个字符
                i++,j++;
            }
            else if(p[j]=='*'){
                char temp=p[j-1];
                if(p[j-1]=='.'){
                    return Match;
                }
                while(temp==s[i]){
                    i++;
                }
                j++;
            }
            else if(p[j]!=s[i]){
                Match=false;
                break;
            }
        }
        return Match;
    }
};

 

正解:

捣乱的java

class Solution {
    public boolean isMatch(String s, String p) {
        return s.matches(p);
    }
}

c++

学会使用string的substr函数

这个答案也不对,,,,我已经不太理解题目的意思了、

分为下边几部分

p为空

p长为1

p长为2且第二个字符是‘*’

p长为2且第二个字符不是‘*“

class Solution {
public:
    bool isMatch(string s, string p) 
    {
        int lenp=p.length();
        for(int i=0;i<lenp-1;i++){
            if(p[i]=='.'&& p[i+1]=='*'){
                return true;
            }
        }
        if(p.empty()){
            return s.empty();
        }    
        else if(p.length()==1){
            return (s.length()==1&&(s[0]==p[0]||p[0]=='.'));
        }
        else if(p[1]!='*'){     //p长>=2且第二个字符不是*
            if(s.empty()){    //在同时去掉第一个字符的过程中,p如果为空会被第一个if发现,但是s.empty(),必须单独另作处理
                return false;
            }
            return ((s[0]==p[0]||p[0]=='.')&&isMatch(s.substr(1),p.substr(1)));
        }
        else{     //p长为2且第二个字符是*
            while(!s.empty() && (p[0]==s[0] || p[0]=='.')){
                s=s.substr(1);
                if(isMatch(s,p.substr(2))||isMatch(s,p)){   //*代表0个字符或*代表多个字符,所以s一直去掉前边那个字符,而p不动,一直用*前边的字符和s比较
                   return true;
                }  
            }
            return isMatch(s,p.substr(2));
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值