leetcode:面試題 16.18. 模式匹配

面試題 16.18. 模式匹配

思路

pattern中的ab看成兩個不同的字符串。字符串value看成xayb按照pattern的模式組合起來的字符串。把所有的這些可能算出來看能不能湊成value

先計算滿足a*x+b*y=c的所有(x,y)vpc表示value的大小。

然後對vp進行遍歷,看能不能湊成value

測試的數據中,有各種特殊樣例。例如:pattern或者value爲空的情況;pattern中a或b的個數爲0的情況。把這些情況都考慮進去就過了。

class Solution {
public:
    // a*x+b*y=c
    vector<pair<int, int>> vpii(int a, int b, int c){
        vector<pair<int, int>> ret;
        // a或者b的個數爲0的情況
        if(a == 0||b == 0){
            if(a == 0) {
                if(c%b == 0)
                    ret.push_back(make_pair(0, c/b));
                return ret;
            }
            else {
                if(c%a == 0)
                    ret.push_back(make_pair(c/a, 0));
                return ret;
            }
        }
        for(int x = 0; x*a <= c ; x ++){
            if((c-x*a) % b == 0)
                ret.push_back(make_pair(x, (c-x*a)/b));
        }
        return ret;
    }
    bool patternMatching(string pattern, string value) {
        int flag[2];
        memset(flag, 0, sizeof(flag));
        for(int i = 0; i < pattern.size(); i ++){
            if(pattern[i] == 'a')
                flag[0] ++;
            else
                flag[1] ++;
        }
        // value爲空的情況
        if(value.size() == 0)
            if(flag[0] == 0||flag[1] == 0) return true;
            else return false;
        // pattern爲空的情況
        if(pattern.size() == 0)
            return false;
        vector<pair<int, int>> vp;
        // a或者b的個數爲空,但是另一個個數不能整除c的情況
        vp = vpii(flag[0], flag[1], value.size());
        if(vp.empty()) return false;
        for(auto& i: vp){
            cout << i.first << ' ' << i.second << endl;
        }
        for(auto& i: vp){
            string a, b;
            int cnt = 0;
            a = b = string("0");
            int f = 1;
            for(int j = 0; j < pattern.size(); j ++){
                string t;
                if(pattern[j] == 'a') {
                    t = value.substr(cnt, i.first);
                    if(a == "0"){
                        a = t;
                        cnt += i.first;
                    }
                    else{
                        if(t == a) 
                            cnt += i.first;
                        else {
                            f = 0;
                            break;
                        }
                    }
                    cout << a << endl;
                }
                else{
                    t = value.substr(cnt, i.second);
                    if(b == "0"){
                        b = t;
                        cnt += i.second;
                    }
                    else{
                        if(t == b)
                            cnt += i.second;
                        else{
                            f =0;
                            break;
                        }
                    }
                    cout << b << endl;
                }
            }
            if(f) return true;
        }
        return false;
        
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章