leetcode-面试题 16.18-模式匹配

class Solution {

public:

    bool patternMatching(string pattern, string value) {

        vector<int> cnt = pre(pattern);

        if (pattern == "") return value == "";

        if (value == "") return pattern == "" || (cnt[0] == 1 && cnt[1] == 0);

        if (cnt[1] == 0) {

            int l;

            if ((value.length() % cnt[0]) != 0) return false;

            else  l = value.length() / cnt[0];

            string s = value.substr(0, l);

            for (int k = l ; k < value.length(); k+=l) {

                if (value.substr(k, l) != s) return false;

            }

            return true;

        }

        for (int i = 0; i <= value.length() / cnt[0]; ++i) {

            mp = {"", ""};

            int flag = 0; //匹配到哪一位

            int la = i, lb;

            if ((value.length() - (la * cnt[0])) % cnt[1] != 0) continue;

            else lb = (value.length() - (la * cnt[0])) / cnt[1];

 

            for (int j = 0; j <= pattern.length(); ++j) {

                if (j == pattern.length()) return true;

                if (flag >= value.length()) break;

                if (pattern[j] == 'a') {

                    if (mp[0].length() == 0) {

                        mp[0] = value.substr(flag, la);

                        if (mp[0] == mp[1] && la != 0) break;

                        flag = flag + la;

                    }

                    else {

                        if (mp[0] != value.substr(flag, la)) break;

                        flag = flag + la;

                    }

                }

                if (pattern[j] == 'b') {

                    if (mp[1].length() == 0) {

                        mp[1] = value.substr(flag, lb);

                        if (mp[0] == mp[1] && lb!=0) break;

                        flag = flag + lb;

                    }

                    else {

                        if (mp[1] != value.substr(flag, lb)) break;

                        flag = flag + lb;

                    }

                }

            }

        }

        return false;

    }

private:

    vector<string> mp; //0a1b;

    vector<int> pre(string &pattern) {

        vector<int> res = {0,0}; //A[0] B[1]

        for (auto s : pattern) {

            if (s == 'a') res[0]++;

            else res[1]++;

        }

        if (res[0] < res[1]) {

            swap(res[0], res[1]);

            for (auto &s : pattern) {

                if (s == 'a') s = 'b';

                else s = 'a';

            }

        }

        return res;

    }

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值