面試題 16.18. 模式匹配(C++)

題目詳情

你有兩個字符串,即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;
    }
};

結果

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