1. 程式人生 > >【leetcode】10. Regular Expression Matching正則表示式匹配

【leetcode】10. Regular Expression Matching正則表示式匹配

思維:

  • 若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"));
    }