你有两个字符串,即pattern和value。 pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a","go"是"b"),该字符串也匹配像"a"、"ab"和"b"这样的模式。但需注意"a"和"b"不能同时表示相同的字符串。编写一个方法判断value字符串是否匹配pattern字符串。
示例 1:
输入: pattern = "abba", value = "dogcatcatdog"
输出: true
暴力枚举,假设a对应的字符串长度为lena,b对应的字符串长度为lenb,那么a*lena+b*lenb=n
枚举合适的lena和lenb,然后按pattern在value找a,b对应的字符串是不是对应的上,并且字符串要不一样
class Solution {
public:
bool patternMatching(string pattern, string value) {
if(pattern.length() == 0)
{
return false;
}
int sa = 0, sb = 0;
for(char& c: pattern)
{
if(c == 'a') sa++;
else sb++;
}
if(sa < sb)
{
swap(sa, sb);
for(char& c: pattern)
c = (c == 'a' ? 'b' : 'a');
}
if(value.length() == 0)
{
return sb == 0;
}
for (int lena = 0; sa * lena <= value.length(); ++lena)
{
int res = value.length() - sa *lena;
if((sb == 0 && res == 0) || (sb != 0 && res % sb == 0))
{
int lenb = sb == 0 ? 0 : ((value.length() - sa * lena) / sb);
bool flag = true;
int pos = 0;
string value_a, value_b;
for(char& c: pattern)
{
if(c == 'a')
{
string sub = value.substr(pos, lena);
if(value_a.size() == 0)
value_a = sub;
else if(value_a != sub)
{
flag = false;
break;
}
pos += lena;
}
else
{
string sub = value.substr(pos, lenb);
if(value_b.size() == 0)
value_b = sub;
else if(value_b != sub)
{
flag = false;
break;
}
pos += lenb;
}
}
if(flag && value_a != value_b)
return true;
}
}
return false;
}
};