前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每天一道剑指offer-正则表达式匹配

每天一道剑指offer-正则表达式匹配

作者头像
乔戈里
发布2019-03-04 10:52:44
4410
发布2019-03-04 10:52:44
举报
文章被收录于专栏:Java那些事

正则表达式匹配

题目描述

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

代码语言:javascript
复制
public boolean match(char[] str, char[] pattern){
}
解析

使用 p1指向 str中下一个要匹配的字符,使用 p2指向 pattern中剩下的模式串的首字符

  1. 如果 p2>=pattern.length,表示模式串消耗完了,这时如果 p1仍有字符要匹配那么返回 false否则返回 true
  2. 如果 p1>=str.length,表示要匹配的字符都匹配完了,但模式串还没消耗完,这时剩下的模式串必须符合 a*b*c*这样的范式以能够作为空串处理,否则返回 false
  3. p1p2都未越界,按照 p2后面是否是 *来讨论
  4. p2后面如果是 *,又可按照 pattern[p2]是否能够匹配 str[p1]分析:
    1. pattern[p2]==‘.’||pattern[p2]==str[p1],这时可以选择匹配一个 str[p1]并继续向后匹配(不用跳过 p2和其后面的 *),也可以选择将 pattern[p2]和其后面的 *作为匹配空串处理,这时要跳过 p2和 其后面的 *
    2. pattern[p2]!=str[p1],只能作为匹配空串处理,跳过 p2
  5. p2后面如果不是 *
    1. pattern[p2]==str[p1]||pattern[p2]==‘.’p1,p2同时后移一个继续匹配
    2. pattern[p2]==str[p1],直接返回 false
代码语言:javascript
复制
public boolean match(char[] str, char[] pattern){    if(str == null || pattern == null){        return false;    }    if(str.length == 0 && pattern.length == 0){        return true;    }    return matchCore(str, 0, pattern, 0);}
public boolean matchCore(char[] str, int p1, char[] pattern, int p2){    //模式串用完了    if(p2 >= pattern.length){        return p1 >= str.length;    }    if(p1 >= str.length){        if(p2 + 1 < pattern.length && pattern[p2 + 1] == '*'){            return matchCore(str, p1, pattern, p2 + 2);        }else{            return false;        }    }
    //如果p2的后面是“*”    if(p2 + 1 < pattern.length && pattern[p2 + 1] == '*'){        if(pattern[p2] == '.' || pattern[p2] == str[p1]){            //匹配一个字符,接着还可以向后匹配;或者将当前字符和后面的星合起来做空串            return matchCore(str, p1 + 1, pattern, p2) || matchCore(str, p1, pattern, p2 + 2);        }else{            return matchCore(str, p1, pattern, p2 + 2);        }    }    //如果p2的后面不是*    else{        if(pattern[p2] == '.' || pattern[p2] == str[p1]){            return matchCore(str, p1 + 1, pattern, p2 + 1);        }else{            return false;        }    }}

出自:http://www.zhenganwen.top

已获授权

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员乔戈里 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正则表达式匹配
    • 题目描述
      • 解析
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档