面試題 16.18. 模式匹配
思路
把pattern
中的a
和b
看成兩個不同的字符串。字符串value
看成x
個a
和y
個b
按照pattern
的模式組合起來的字符串。把所有的這些可能算出來看能不能湊成value
。
先計算滿足a*x+b*y=c
的所有(x,y)
對vp
。c
表示value的大小。
然後對vp
進行遍歷,看能不能湊成value
。
測試的數據中,有各種特殊樣例。例如:pattern或者value爲空的情況;pattern中a或b的個數爲0的情況。把這些情況都考慮進去就過了。
class Solution {
public:
// a*x+b*y=c
vector<pair<int, int>> vpii(int a, int b, int c){
vector<pair<int, int>> ret;
// a或者b的個數爲0的情況
if(a == 0||b == 0){
if(a == 0) {
if(c%b == 0)
ret.push_back(make_pair(0, c/b));
return ret;
}
else {
if(c%a == 0)
ret.push_back(make_pair(c/a, 0));
return ret;
}
}
for(int x = 0; x*a <= c ; x ++){
if((c-x*a) % b == 0)
ret.push_back(make_pair(x, (c-x*a)/b));
}
return ret;
}
bool patternMatching(string pattern, string value) {
int flag[2];
memset(flag, 0, sizeof(flag));
for(int i = 0; i < pattern.size(); i ++){
if(pattern[i] == 'a')
flag[0] ++;
else
flag[1] ++;
}
// value爲空的情況
if(value.size() == 0)
if(flag[0] == 0||flag[1] == 0) return true;
else return false;
// pattern爲空的情況
if(pattern.size() == 0)
return false;
vector<pair<int, int>> vp;
// a或者b的個數爲空,但是另一個個數不能整除c的情況
vp = vpii(flag[0], flag[1], value.size());
if(vp.empty()) return false;
for(auto& i: vp){
cout << i.first << ' ' << i.second << endl;
}
for(auto& i: vp){
string a, b;
int cnt = 0;
a = b = string("0");
int f = 1;
for(int j = 0; j < pattern.size(); j ++){
string t;
if(pattern[j] == 'a') {
t = value.substr(cnt, i.first);
if(a == "0"){
a = t;
cnt += i.first;
}
else{
if(t == a)
cnt += i.first;
else {
f = 0;
break;
}
}
cout << a << endl;
}
else{
t = value.substr(cnt, i.second);
if(b == "0"){
b = t;
cnt += i.second;
}
else{
if(t == b)
cnt += i.second;
else{
f =0;
break;
}
}
cout << b << endl;
}
}
if(f) return true;
}
return false;
}
};