面试:字符串: 正则匹配
2016-06-09 20:12
501 查看
题目
是否正则匹配,”.” 匹配任意字符和 “*”匹配0个或多个前一个字符isMatch(“a”,”a”)=true
isMatch(“a*”,”aa”)=true
isMatch(“ab”,”.*”)=true
isMatch(“ab”,”a*bc*”)=trune
算法
如果已经完成遍历p,则要求s也被遍历完成如果pi的下一个字符不是*,则匹配pi和si的当前字符,如果匹配成功,则递归调用函数匹配pi+1和si+1
如果pi的下一个字符是”*”则
(1) 跳过*符号,递归调用函数匹配pi+2和si
(2) 不跳过*符号,继续匹配pi和si+1
最后,还需要比较pi+2和si的情况,因为如果si到头,”.*”是可以匹配空串
import java.util.*; class Solution{ public boolean isMatch(String s,String p){ if(s==null) return p==null; if(p==null) return false; return isMatch(s,p,0,0); } private boolean isMatch(String s, String p ,int i, int j){ //p到头了,看看s是否到头 if(j==p.length()) return i==s.length(); //如果后一个字符不是*的情况 if(j==p.length()-1||p.charAt(j+1)!='*'){ if(i==s.length()) return false; //转下一个字符 return (p.charAt(j)=='.'||s.charAt(i)==p.charAt(j)) && isMatch(s,p,++i,++j); } while(i<s.length() && (p.charAt(j)=='.'||s.charAt(i)==p.charAt(j))){ //跳过*字符,如果匹配,返回true,否则继续比较 if(isMatch(s,p,i,j+2)) return true; i++; } //跳过*字符,方便检查s到头的情况 return isMatch(s,p,i,j+2); } }
相关文章推荐
- 程序员提高效率的必备工具
- 面试:字符串: 提取IP地址
- 一座熟悉而陌生的城市--一个程序员的成长史(7)
- 面试:字符串: 字符串转换为10进制数
- 海量数据处理面试题方法总结
- java 数据类型,运算符 分支语句 面试知识点总结与习题
- mark[一个32岁入门的70后程序员给我的启示]
- php程序员经验
- 那些不能遗忘的知识点回顾——操作系统系列(笔试面试高频题)
- 来自投资银行的20个Java面试题--转自码农网
- 阿里面试题总结
- 关于一道简单的Java 基础面试题的剖析: short s1=1;s1 = s1 +1会报错吗?
- 谷歌2014面试题 Problem E. Spaceship Defence(spfa,哈希)
- 一个32岁入门的70后程序员给我的启示
- 一个32岁入门的70后程序员给我的启示
- 作为Java程序员这些都不知道那就真的OUT了!
- 一个32岁入门的70后程序员给我的启示(转)
- 浅谈HashMap与HashTable
- Android面试题目(1-2-3--7)
- Servlet & JSP 面试题