Leetcode:面試題 16.18. 模式匹配

題目

你有兩個字符串,即pattern和value。 pattern字符串由字母"a"和"b"組成,用於描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a",“go"是"b”),該字符串也匹配像"a"、"ab"和"b"這樣的模式。但需注意"a"和"b"不能同時表示相同的字符串。編寫一個方法判斷value字符串是否匹配pattern字符串。

示例 1:

輸入: pattern = "abba", value = "dogcatcatdog"
輸出: true
示例 2:

輸入: pattern = "abba", value = "dogcatcatfish"
輸出: false
示例 3:

輸入: pattern = "aaaa", value = "dogcatcatdog"
輸出: false
示例 4:

輸入: pattern = "abba", value = "dogdogdogdog"
輸出: true


解釋: "a"="dogdog",b="",反之也符合規則
提示:

0 <= len(pattern) <= 1000
0 <= len(value) <= 1000
你可以假設pattern只包含字母"a""b",value僅包含小寫字母。

鏈接:https://leetcode-cn.com/problems/pattern-matching-lcci

解題記錄

  • 邏輯挺簡單的但是寫起來還挺複雜的,需要關注的點比較多
  • 特殊情況:
    1. p爲空,v爲空: true
    2. p爲空,v不爲空:false
    3. v爲空,p爲0或1:true 否則 false
    4. p爲1,也就是隻有a或者b,一定可以匹配 爲 true
    5. p爲ab或者ba 在 v不爲空的情況可以匹配
  • 通過統計ab的個數,通過枚舉a的長度,根據每種a的長度算出b的長度
  • 這裏要特殊處理a,b個數爲0的情況,因爲有可能求不出lenB
  • 遍歷v,通過比較每一個截取出來的a,b,是否跟第一個a,b相同,如果截取出來的a,b都能匹配的上那麼true
  • 還要判斷一下a,b是否相同,如果a,b相同的話那麼違反題目要求不能算
/**
 * @author ffzs
 * @describe
 * @date 2020/6/22
 */
public class Solution {
    public static boolean patternMatching(String pattern, String value) {

        // 單個 a或者b 一定爲true
        if (pattern.length() == 1) return true;
        // p,v都爲空則爲 true
        else if (pattern.length() == 0) return value.length() == 0;
        else if (value.length() == 0) return false;

        char[] pChar = pattern.toCharArray();
        char[] vChar = value.toCharArray();
        
        int countA = 0;
        for (char c : pChar) {
            if (c == 'a') countA++;
        }
        int countB = pChar.length - countA;

        // 判斷 只有a或者b的情況
        if (countA == 0 || countB == 0) {
            if (vChar.length % pChar.length != 0) {
                return false;
            }
            else {
                int len = vChar.length / pChar.length;
                for (int i = 1; i < pChar.length; ++i) {
                    if (!isMatch(vChar, 0, i*len, len)) return false;
                }
                return true;
            }
        }
        else if (countA == 1 && countB == 1) return true;

        for (int lenA = 0; countA * lenA <= vChar.length ; lenA++) {
            if ((vChar.length - countA * lenA) % countB == 0) {
                int lenB = (vChar.length - countA * lenA) / countB;
                int ai = -1, bi = -1 , index = 0;
                for (int i = 0; i < pChar.length; i++) {
                    if (pChar[i] == 'a') {
                        if (ai == -1) ai = index;
                        else {
                            if (!isMatch(vChar, ai, index, lenA)) break ;
                        }
                        index += lenA;
                    }
                    else {
                        if (bi == -1) bi = index;
                        else {
                            if (!isMatch(vChar, bi, index, lenB)) break ;
                        }
                        index += lenB;
                    }
                    if (lenA == lenB && bi == -1 && ai == -1) {
                        if (isMatch(vChar, ai, bi, lenA)) break;
                    }
                }
                if (index == vChar.length ) return true;
            }
        }
        return false;
    }

    private static boolean isMatch (char[] s, int s1, int s2, int len) {

        for (int i = 0; i < len; ++i) {
            if (s[s1+i] != s[s2+i]) return false;
        }
        return true;
    }

    public static void main(String[] args) {
        String p = "bb";
        String v = "";
        System.out.println(patternMatching(p,v));
    }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章