Leetcode C++《每日一題》20200622 面試題 16.18. 模式匹配
1. 題目
你有兩個字符串,即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僅包含小寫字母。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/pattern-matching-lcci
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2.思路
- 可以遍歷ab可能出現的字符,然後對比和value是不是相等,如果有相等的,證明匹配上了,如果沒有則沒有
- 整個可以做一個遞歸,比如a先匹配上了,遞歸繼續匹配
- a的長度確定之後,b的長度也就確定了
- a的長度遍歷是0-n的複雜度,對比每一次需要n,所以是一個n*n
3.代碼
class Solution {
public:
bool patternMatching(string pattern, string value) {
if (pattern.length() == 0)
return value.length() == 0 ? true:false;
char startChar = pattern[0];
int startNum = 0;
int nextNum = 0;
for (int i = 0; i <pattern.length(); i++) {
if (pattern[i] == startChar) {
startNum++;
} else {
nextNum++;
}
}
if (value == "" ){
return nextNum==0?true:false;
}
int tryStartLength = 0;
int tryNextLength = 0;
for (int i = 0; i <=value.length(); i++) {
tryStartLength = i;
//cout << value.length() << " " << tryStartLength << " " << startNum << endl;
int temp = value.length()-tryStartLength*startNum;
if (temp < 0)
continue;
//cout <<tryStartLength << " : " <<value.length()-(tryStartLength*startNum) << endl;
if (nextNum!=0 && (value.length()-tryStartLength*startNum)%nextNum!=0)
continue;
else {
if (nextNum != 0)
tryNextLength = (value.length()-tryStartLength*startNum)/nextNum;
//cout << tryStartLength << " " << tryNextLength << endl;
string startPattern ="";
string nextPattern ="";
string patternValue="";
int index = 0;
for (int j = 0; j <pattern.length(); j++) {
if (pattern[j] == startChar) {
if (startPattern=="")
startPattern = value.substr(index, tryStartLength);
patternValue += startPattern;
index += tryStartLength;
} else {
if (nextPattern=="")
nextPattern = value.substr(index, tryNextLength);
patternValue += nextPattern;
index += tryNextLength;
}
}
bool flag = true;
//cout << patternValue << " BEGIN " << flag << endl;
if (patternValue.length() != value.length())
continue;
for (int j = 0; j < patternValue.length(); j++) {
if (patternValue[j] != value[j]) {
flag = false;
break;
}
}
//cout << patternValue << " END " << flag << endl;
if (flag)
return true;
}
}
return false;
}
};
4.debug
bug 1:
“ab”
“”
value="" 特殊判斷
bug2:
“bbbaa”
“xxxxxxy”
if 條件用這個判斷:value.length()-tryStartLength*startNum,不行,非要賦值爲int,數據紊亂
bug3:
“a”
“zqvamqvuuvvazv”
遍歷x代表的字符串的時候,它的長度是0-value.length()