正则表达式匹配
题目形容:给你一个字符串 s 和一个字符法则 p,请你来实现一个反对 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个后面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是局部字符串。示例阐明请见LeetCode官网。
起源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。
解法一:遍历、递归
遍历p,将s和p进行匹配。分几种状况,别离是 '.' 或 '*' 或者两者都不是的状况, '.' 和两者都不是的绝对比较简单,比较复杂点的是'*'的判断,因为'*'是匹配零个或多个元素,所以用到了递归。
public class Solution { public static boolean isMatch(String s, String p) { if ((s == null || s.length() == 0) && (p == null || p.length() == 0)) { return true; } if ((p == null || p.length() == 0) && s.length() > 0) { return false; } char preChar = 0; boolean havePreChar = false; int sIndex = 0; for (int i = 0; i < p.length(); i++) { if (p.charAt(i) == '.') { if (i < p.length() - 1 && p.charAt(i + 1) == '*') { preChar = p.charAt(i); havePreChar = true; continue; } else { if (sIndex < s.length()) { preChar = s.charAt(sIndex); sIndex++; havePreChar = true; continue; } else { return false; } } } if (p.charAt(i) == '*') { if (!havePreChar) { return false; } if (sIndex == s.length()) { if (p.length() - 1 == i) { return true; } else { return isMatch("", p.substring(i + 1)); } } else { if (preChar == '.') { if (i == p.length() - 1) { return true; } while (sIndex < s.length()) { boolean result = isMatch(s.substring(sIndex), p.substring(i + 1)); if (result) { return true; } sIndex++; continue; } } else { while (sIndex < s.length()) { if (s.charAt(sIndex) == preChar) { boolean result = isMatch(s.substring(sIndex), p.substring(i + 1)); if (result) { return true; } sIndex++; continue; } else { break; } } } havePreChar = false; } } if (p.charAt(i) != '*' && p.charAt(i) != '.') { if (i < p.length() - 1 && p.charAt(i + 1) == '*') { preChar = p.charAt(i); havePreChar = true; continue; } else { if (sIndex == s.length() || s.charAt(sIndex) != p.charAt(i)) { return false; } else { sIndex++; havePreChar = false; continue; } } } } if (sIndex < s.length()) { return false; } return true; } public static void main(String[] args) { String s = "", p = "c*c*"; // true System.out.println(isMatch(s, p)); }}