Leetcode C++《每日一題》20200622 面試題 16.18. 模式匹配

Leetcode C++《每日一題》20200622 面試題 16.18. 模式匹配

1. 題目

你有兩個字符串,即pattern和value。 pattern字符串由字母"a"和"b"組成,用於描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a",“go"是"b”),該字符串也匹配像"a"、"ab"和"b"這樣的模式。但需注意"a"和"b"不能同時表示相同的字符串。編寫一個方法判斷value字符串是否匹配pattern字符串。

示例 1:

輸入: pattern = “abba”, value = “dogcatcatdog”
輸出: true
示例 2:

輸入: pattern = “abba”, value = “dogcatcatfish”
輸出: false
示例 3:

輸入: pattern = “aaaa”, value = “dogcatcatdog”
輸出: false
示例 4:

輸入: pattern = “abba”, value = “dogdogdogdog”
輸出: true
解釋: “a”=“dogdog”,b="",反之也符合規則
提示:

0 <= len(pattern) <= 1000
0 <= len(value) <= 1000
你可以假設pattern只包含字母"a"和"b",value僅包含小寫字母。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/pattern-matching-lcci
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2.思路

  • 可以遍歷ab可能出現的字符,然後對比和value是不是相等,如果有相等的,證明匹配上了,如果沒有則沒有
  • 整個可以做一個遞歸,比如a先匹配上了,遞歸繼續匹配
  • a的長度確定之後,b的長度也就確定了
  • a的長度遍歷是0-n的複雜度,對比每一次需要n,所以是一個n*n

3.代碼

class Solution {
public:
    bool patternMatching(string pattern, string value) {
        
        if (pattern.length() == 0)
            return value.length() == 0 ? true:false; 
        
        char startChar = pattern[0];
        int startNum = 0;
        int nextNum = 0;
        for (int i = 0; i <pattern.length(); i++) {
            if (pattern[i] == startChar) {
                startNum++;
            } else {
                nextNum++;
            }
        }
        if (value == "" ){
            return nextNum==0?true:false;
        }
        int tryStartLength = 0;
        int tryNextLength = 0;
        
        for (int i = 0; i <=value.length(); i++) {
            tryStartLength = i;
           //cout << value.length() << " "  << tryStartLength << " " <<  startNum <<  endl;
           int temp = value.length()-tryStartLength*startNum;
           
            if (temp < 0)
                continue;
            //cout <<tryStartLength << " : " <<value.length()-(tryStartLength*startNum) << endl;
            if (nextNum!=0 && (value.length()-tryStartLength*startNum)%nextNum!=0)
                continue;
            else {
                if (nextNum != 0)
                    tryNextLength = (value.length()-tryStartLength*startNum)/nextNum;
                //cout << tryStartLength << " " << tryNextLength << endl;
                string startPattern ="";
                string nextPattern ="";
                string patternValue="";
                int index = 0;
                for (int j = 0; j <pattern.length(); j++) {
                    if (pattern[j] == startChar) {
                        if (startPattern=="")
                            startPattern = value.substr(index, tryStartLength);
                        patternValue += startPattern;
                        index += tryStartLength;
                    } else {
                        if (nextPattern=="")
                            nextPattern = value.substr(index, tryNextLength);
                        patternValue += nextPattern;
                        index += tryNextLength;
                    }
                }
                
                bool flag = true;
                //cout << patternValue <<  " BEGIN  " << flag << endl;
                if (patternValue.length() != value.length())
                    continue;
                for (int j = 0; j < patternValue.length(); j++) {
                    if (patternValue[j] != value[j]) {
                        flag = false;
                        break;
                    }
                }
                //cout << patternValue <<  " END  " << flag << endl;
                if (flag)
                    return true;
            }
        }
        return false;
    }
};

4.debug

bug 1:
“ab”
“”
value="" 特殊判斷

bug2:
“bbbaa”
“xxxxxxy”
if 條件用這個判斷:value.length()-tryStartLength*startNum,不行,非要賦值爲int,數據紊亂

bug3:
“a”
“zqvamqvuuvvazv”
遍歷x代表的字符串的時候,它的長度是0-value.length()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章