面试题 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;
}
};