面试题 16.18. 模式匹配

你有两个字符串,即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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值