題目詳情
你有兩個字符串,即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僅包含小寫字母。
——題目難度:中等
-下面代碼有詳細註釋
class Solution {
public:
bool patternMatching(string pattern, string value) {
//預處理 pattern的長度,value的長度,'a'、'b'的個數
int cnt[2] = {0}; //cnt[0]表示'a'的個數,cnt[1]表示'b'的個數
int n = pattern.size(), m = value.size();
for (char x : pattern)
{
if (x == 'a') cnt[0]++;
else if(x == 'b') cnt[1]++;
}
//1.pattern爲空
if (n == 0) {
return m == 0? true : false;
}
//2.value爲空
//看pattern是否只有一種字母組成
if (m == 0) {
if (cnt[0] && cnt[1]) return false; //"a"、"b"不能同時表示""
if (cnt[0] || cnt[1]) return true;
return false; //cnt[0]和cnt[1]都爲0
}
//3.pattern不爲空,value也不爲空
//3.1看是否pattern只包含一種字母
if (cnt[0] == 0) return helper(value, cnt[1]);
if (cnt[1] == 0) return helper(value, cnt[0]);
//3.2假設"a"或"b"其中一個表示爲""的情況
if (helper(value, cnt[0])) return true;
if (helper(value, cnt[1])) return true;
//3.3開始枚舉len_a(len_b可以由len_b決定)
//如果滿足cnt[0] * len_a + cnt[1] * len_b = m,就進入check函數中做最後的校對
for (int len_a = 1; cnt[0] * len_a <= m - cnt[1]; len_a++)
{
if ((m - cnt[0] * len_a) % cnt[1] != 0) continue;
int len_b = (m - cnt[0] * len_a) / cnt[1];
if (check(pattern, value, len_a, len_b)) return true;
}
return false;
}
bool helper(string value, int k) {
int n = value.size();
string t = "";
if (n % k != 0) return false;
int len = n / k;
for (int i = 0; i < n; i += len)
{
if (i == 0) {
t = value.substr(0, len);
} else {
if (value.substr(i, len) != t) return false;
}
}
return true;
}
bool check(string pattern, string value, int len_a, int len_b) {
string t[2] = {"", ""};
for (int i = 0, j = 0; i < pattern.size(); i++)
{
if (pattern[i] == 'a') {
if (t[0] == "") {
t[0] = value.substr(j, len_a);
} else {
if (value.substr(j, len_a) != t[0]) return false;
}
j += len_a;
}
else if(pattern[i] == 'b') {
if (t[1] == "") {
t[1] = value.substr(j, len_b);
} else {
if (value.substr(j, len_b) != t[1]) return false;
}
j += len_b;
}
}
if (t[0] == t[1]) return false;
return true;
}
};
結果