题目
你有两个字符串,即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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
- 边界情况
pattern == 0 false , value == 0 true
-
特殊情况
-
选定值长度自增[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;
}
- 本文链接: https://halo.cjh.kim/archives/算法题模式匹配
- 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!