题目
设定一种匹配规则,‘ . ’ 匹配任意单个字符,‘ * ’ 匹配一个或多个它之前的字符。
方法可以写成boolean isMatch(String s,String p),即p来匹配s 。
例如;
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b")→ true
分析
将问题简化为2种基本情况
1.p的第二个字符是‘ * ’
2. p的第二个字符不是‘ * ’
对于情况1,若p的第一个字符不是‘ . ’ ,则p与s的第一个字符应该相同;然后再匹配p与s余下的部分。
对于情况2,若p的第一个字符是‘ . ’ ,或者p的第一个字符与s的第i个字符相同(i是递归次数),则继续匹配p与s余下的部分。
代码(Java)
public class RegularExpressionMatching {
public boolean isMatch(String s,String p){
if (p.length()==0) {
return s.length()==0;
}
//p的长度为1
if (p.length()==1) {
if (s.length()<1) {
return false;
}
else if ((p.charAt(0))!=s.charAt(0)&&p.charAt(0)!='.') {
return false;
}
else {
return isMatch(s.substring(1), p.substring(1));
}
}
if (p.charAt(1)!='*') {
if (s.length()<1) {
return false;
}
else if ((p.charAt(0))!=s.charAt(0)&&p.charAt(0)!='.') {
return false;
}
else {
return isMatch(s.substring(1), p.substring(1));
}
}
else {
if (isMatch(s, p.substring(2))) {
return true;
}
}
int i=0;
while(i<s.length()&&(s.charAt(i)==p.charAt(0)||p.charAt(0)=='.')){
if (isMatch(s.substring(i+1), p.substring(2))) {
return true;
}
i++;
}
return false;
}
public static void main(String[] args) {
System.out.println(new RegularExpressionMatching().isMatch("aa","a"));
System.out.println(new RegularExpressionMatching().isMatch("aa","aa"));
System.out.println(new RegularExpressionMatching().isMatch("aaa","aa"));
System.out.println(new RegularExpressionMatching().isMatch("aa", "a*"));
System.out.println(new RegularExpressionMatching().isMatch("aa", ".*"));
System.out.println(new RegularExpressionMatching().isMatch("ab", ".*"));
System.out.println(new RegularExpressionMatching().isMatch("aab", "c*a*b"));
System.out.println(new RegularExpressionMatching().isMatch("aab", "c*a*cbaab"));
}
}
引用
http://www.programcreek.com/2012/12/leetcode-regular-expression-matching-in-java/