306.累计数题目链接:https://leetcode-cn.com/probl...难度:中等题目描述累计数是一个字符串,组成的数字可以形成一个积累序列。一个有效的累积序列必须包含至少3个数字。除了前两个数字,字符串中的其他数字等于它前面两个数字的和。给定一个仅包含数字'0'-'9'的字符串,编写一个算法来确定给定的输入是否为累加数。解释:累加序列中的数字不会以0开头,所以不会出现1、2、03或1、02、3。示例输入:“112358”输出:true解释:累积序列为:1,1,2,3,5,8。1+1=2,1+2=3,2+3=5,3+5=8输入:“199100199”输出:true解释:累加顺序为:1,99,100,1991+99=100,99+100=199思路1.找到满足第一个累加的前三个数group,然后判断该字符串是否为累加数。2.如果不存在,则循环上一步1/***@paramString$num*@returnBoolean*/functionisAdditiveNumber($num){$len=strlen($num);如果($len<3){返回假;}$firstNum=0;$secondNum=0;$总和=0;//回溯法,不断寻找正好匹配的三个累加数for($i=2;$i<$len;$i++){$subLen=$i+1;对于($j=1;$j<(int)(($subLen+1)/2);$j++){$firstNumLen=$j;对于($k=1;$k<(int)(($subLen+1)/2);$k++){$secondNumLen=$k;如果(0===strpos(substr($num,0,$firstNumLen),'0')&&$firstNumLen!=1){继续;}if(0===strpos(substr($num,$firstNumLen,$secondNumLen),'0')&&$secondNumLen!=1){继续;}if(0===strpos(substr($num,$firstNumLen+$secondNumLen,$subLen-$firstNumLen-$secondNumLen),'0')&&$subLen-$firstNumLen-$secondNumLen!=1){继续;}$firstNum=(int)substr($num,0,$firstNumLen);$secondNum=(int)substr($num,$firstNumLen,$secondNumLen);$sumNum=(int)substr($num,$firstNumLen+$secondNumLen,$subLen-$firstNumLen-$secondNumLen);如果($firstNum+$secondNum==$sumNum){$isAdditiveNumber=$this->verifyAdditiveNumber($num,$firstNum,$secondNum,$sumNum);如果($isAdditiveNumber){返回真;}}}}}返回假;}//验证整个字符串是否为累加数字字符串publicfunctionverifyAdditiveNumber($num,$firstNum,$secondNum,$sumNum){if($firstNum+$secondNum!=$sumNum){}$startIdx=0;同时(真){$tmpSumNum=(字符串)($secondNum+$sumNum);$tmpStartLen=($startIdx+strlen($firstNum)+strlen($secondNum)+strlen($sumNum));如果($tmpStartLen==strlen($num)){返回真;}if(substr($num,$tmpStartLen,strlen($tmpSumNum))!=$tmpSumNum){返回false;}$startIdx=$startIdx+strlen($firstNum);$firstNum=$secondNum;$secondNum=$sumNum;$sumNum=(int)$tmpSumNum;}}
