实时更新的累加php,php算法题:306累加数

本文介绍了LeetCode第306题累加数的解决方案。通过回溯法找到可能的累加数序列,并验证整个字符串是否符合累加数的条件。算法首先检查字符串长度是否大于等于3,然后通过三层循环寻找满足累加条件的连续三个数。如果找到,继续验证后续部分;否则,继续尝试不同组合。最后,提供了一个完整的PHP实现代码作为示例。
摘要由CSDN通过智能技术生成

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, 199。1 + 99 = 100, 99 + 100 = 199

思路

1.找出第一组前三个满足累加的数,再进行判断字符串是否为累加数。

2.如果不存在,则循环上一步操作

1

/**

* @param String $num

* @return Boolean

*/

function isAdditiveNumber($num) {

$len = strlen($num);

if($len < 3){

return false;

}

$firstNum = 0;

$secondNum = 0;

$sumNum = 0;

//回溯法,不断找出恰三个符合的累加数

for ($i=2; $i

$subLen = $i+1;

for($j=1;$j

$firstNumLen = $j;

for($k=1;$k

$secondNumLen = $k;

if(0===strpos(substr($num,0,$firstNumLen),'0') && $firstNumLen != 1){

continue;

}

if(0===strpos(substr($num,$firstNumLen,$secondNumLen),'0') && $secondNumLen!= 1){

continue;

}

if(0===strpos(substr($num,$firstNumLen+$secondNumLen,$subLen-$firstNumLen-$secondNumLen),'0') && $subLen-$firstNumLen-$secondNumLen!= 1){

continue;

}

$firstNum = (int)substr($num,0,$firstNumLen);

$secondNum = (int)substr($num,$firstNumLen,$secondNumLen);

$sumNum = (int)substr($num,$firstNumLen+$secondNumLen,$subLen-$firstNumLen-$secondNumLen);

if($firstNum+$secondNum == $sumNum){

$isAdditiveNumber = $this->verifyAdditiveNumber($num,$firstNum,$secondNum,$sumNum);

if($isAdditiveNumber){

return true;

}

}

}

}

}

return false;

}

//验证整个字符串是否为累加数字符串

public function verifyAdditiveNumber($num,$firstNum,$secondNum,$sumNum){

if($firstNum+$secondNum != $sumNum){

return false;

}

$startIdx = 0;

while(true){

$tmpSumNum = (string)($secondNum + $sumNum);

$tmpStartLen = ($startIdx+strlen($firstNum)+strlen($secondNum)+strlen($sumNum));

if($tmpStartLen == strlen($num)){

return true;

}

if(substr($num,$tmpStartLen,strlen($tmpSumNum)) != $tmpSumNum){

return false;

}

$startIdx = $startIdx + strlen($firstNum);

$firstNum = $secondNum;

$secondNum = $sumNum;

$sumNum = (int)$tmpSumNum;

}

}

原文链接:https://segmentfault.com/a/1190000020426923

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值