题目

你有两个字符串,即patternvaluepattern字符串由字母"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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

  1. 边界情况
pattern == 0  false , value == 0  true
  1. 特殊情况

  2. 选定值长度自增[0,长度最大值],再进行匹配

code

 /**
     * @param String $pattern
     * @param String $value
     * @return Boolean
     */
    function patternMatching($pattern, $value) {
        
        $lengthPattern=strlen($pattern);
        $lengthValue=strlen($value);
        $lengthA=0;
        $lengthB=0;
        //获取pattern中 a,b数量
        $countA = substr_count($pattern,'a');
        $countB = $lengthPattern-$countA;

        //边界情况
        if(!$lengthValue&&!$lengthPattern)return true;
        if(!$lengthPattern)return false;
        if($countA*$countB&&!$lengthValue){
           return false;
        }
        //特殊情况
        if($countA===1||$countB===1){
               return true;
        }
        //ab首次出现位置
        $indexA=strpos($pattern,'a');
        $indexB=strpos($pattern,'b');
        //ab换成不会出现的特殊字符串
        $patternReplace=str_replace('a','+',$pattern);
        $patternReplace=str_replace('b','-',$patternReplace);
        $count = 1;
        $countA && $count =$lengthValue/$countA;
        for($i=0;$i<$count+1;$i++){
            $replaceString=$patternReplace;
            $lengthB=0;
            $countB && $lengthB=($lengthValue-$i*$countA)/$countB;
            if(!is_int($lengthB))continue;
            if(!$indexA){
                $mappingA=substr($value,0,$i);
                $mappingB=substr($value,$indexB*$i,$lengthB);
            }else{
                $mappingB=substr($value,0,$lengthB);
                $mappingA=substr($value,$indexA*$lengthB,$i);
            }
            //字符串替换
            $resultStr=str_replace('+',$mappingA,$replaceString);
            $resultStr=str_replace('-',$mappingB,$resultStr);
            if($resultStr===$value&&$mappingA!=$mappingB)return true;
        }
        return false;
       

    }