題目
你有兩個字符串,即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
解題記錄
- 邏輯挺簡單的但是寫起來還挺複雜的,需要關注的點比較多
- 特殊情況:
- p爲空,v爲空: true
- p爲空,v不爲空:false
- v爲空,p爲0或1:true 否則 false
- p爲1,也就是隻有a或者b,一定可以匹配 爲 true
- 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));
}
}