思路解析:
代码如下:
class Solution {
public:
bool patternMatching(string pattern, string value) {
int pattern_len=pattern.length();
int value_len=value.length();
int count_a=0,count_b=0;
for(int i=0;i<pattern_len;i++)
{
if(pattern[i]=='a')
{
count_a++;
}
else
{
count_b++;
}
}
//将a和b换一下位置,如果b的数量更多的话,有助于减少后面的循环次数
if (count_a < count_b) {
swap(count_a, count_b);
for (char& ch: pattern) {
ch = (ch == 'a' ? 'b' : 'a');
}
}
//考虑value长度为0的情况,只有当pattern长度也为0或者全为a或者全为b时return true
if(value_len==0)
{
if(pattern_len==0)
return true;
else
{
if(count_a>count_b)
{
if(count_b!=0)
{
return false;
}
else
return true;
}
else
{
if(count_a!=0)
{
return false;
}
else
{
return true;
}
}
}
}
for(int i=0;value_len-i*count_a>=0;i++)//注意限制条件value_len-i*count_a>=0
{
if(count_b!=0&&(value_len-i*count_a)%count_b!=0)
{
continue;
}
int b_len;
if(count_b==0)
{
b_len=0;
}
else
{
b_len=(value_len-i*count_a)/count_b;
}
string a;
string b;
if(pattern[0]=='a')
{
int j;
for(j=0;j<i;j++)
{
a+=value[j];//字符串赋值不能写a[i]=XX,要写+=!!
}
int k=1;
while(k<pattern_len&&pattern[k]!='b')
{
k++;
}
if(k==pattern_len)
{
b=b;
}
else
{
for(int m=0;m<b_len;m++)
{
b+=value[j+(k-1)*i+m];
}
}
}
else
{
int j;
for(j=0;j<b_len;j++)
{
b+=value[j];
}
int k=1;
while(k<pattern_len&&pattern[k]!='a')
{
k++;
}
if(k==pattern_len)
{
a=a;
}
else
{
for(int m=0;m<i;m++)
{
a+=value[j+(k-1)*b_len+m];
}
}
}
if(a==b)
{
continue;
}
//现在a和b代表的是啥字符串已经求出来了,接下来求出构成的ans,与value比对
string ans;
for(int p=0;p<pattern_len;p++)
{
if(pattern[p]=='a')
{
ans+=a;
}
else
{
ans+=b;
}
}
if(ans==value)
{
return true;
}
}
return false;
}
};