正則比對
Regular Expression Matching
Implement regular expression matching with support for
'.'
and '*'
. '.' Matches any single character.
'*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
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
1 package com.rust.TestString;
2
3 class Solution {
4 public boolean isMatch(String s, String p) {
5 if (p.length() == 0) {
6 return s.length() == 0;
7 }
8 if (p.length() == 1) {
9 return (s.length() == 1) && (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.');
10 }
11 // next char is not '*': must match current character
12 if (p.charAt(1) != '*') {
13 if (s.length() == 0) {
14 return false;
15 } else {
16 return (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.')
17 && isMatch(s.substring(1), p.substring(1)); // judge next char
18 }
19 } else { // next char is '*'
20 while (s.length() > 0 && (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.')) {
21 if (isMatch(s, p.substring(2))) {
22 return true;
23 }
24 s = s.substring(1);
25 }
26 return isMatch(s, p.substring(2));
27 }
28 }
29 }
30
31
32 public class RegularExpressionMatching {
33 public static void main(String args[]){
34 Solution solution = new Solution();
35 String s = "abcdefg";
36 System.out.println(solution.isMatch(s, "abcde*"));
37 System.out.println(solution.isMatch(s, ".*"));
38 System.out.println(solution.isMatch("abcdefg", "a.*"));
39 System.out.println(solution.isMatch("abcdefg", ".b."));
40 System.out.println(solution.isMatch("abcdefg", ""));
41 System.out.println(s);
42 }
43 }
輸出:
false
true
abcdefg