地址:https://leetcode.com/problems/regular-expression-matching/description/
思维:
- 若p为空,若s也为空,返回true,反之返回false
- 若p的长度为1,若s的长度也为1,且相同或者p为’.’,那么返回true,否则返回false;
- 若p的第二格字符不为*,且s是空的,那返回false,如果s不为空,且第一个字符相同,那么开始调用递归匹配除第一个字符的字符串。
- 若p的第二个字符是*,那么当s不为空,开始匹配,(在第一个字符相同的基础上)调用递归匹配s和去掉前两个字符的p,若匹配返回true,否则s去掉首字母
- 返回调用递归函数匹配s和去掉前两个字符的p的结果
代码:
//利用递归的思维,对字符串进行截取比较
public static boolean isMatch(String s, String p) {
if (p.isEmpty()) return s.isEmpty();//第一种情况:如果p是空的话,那么返回是否为空
if (p.length() == 1){//第二种情况:如果p的长度是1的话,那么只需要判断s的长度是1且两个相同,或者p是"."
return s.length() == 1 && (s.charAt(0) == p.charAt(0) || p.charAt(0)=='.');
}
if (p.charAt(1) != '*'){
if (s.isEmpty()) return false;
return (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.') && isMatch(s.substring(1),p.substring(1));
}
while (!s.isEmpty() && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.')){
if (isMatch(s,p.substring(2))) return true;
s = s.substring(1);
}
return isMatch(s,p.substring(2));
}
public static void main(String[] args) {
System.out.println(isMatch("ab",".a"));
}