【面试题 16.18. 模式匹配】本质上是求ax+by=len方程组的解&&注意细节和时间复杂度

 

 思路解析:

 

 

代码如下:

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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值