leetcode: Additive Number

利用搜索的方法求解....实际上只要确定前两个数字就可以确定整个序列....那么我们不妨便利前两个数字的所有合法组合,判断这个序列是否存在....

通过对两个数字搜索范围的剪枝可以加快效率,使用三个数字first, second, third代表前三个数在字符串中的起始坐标,first恒定为0;


public class Solution {
    public boolean isAdditiveNumber(String num) {
        int len=num.length();
        int first=0,second=0,third=0;
        if( len<3 )
        {
            return false;
        }
        for(second=1;second-first<=len/2;second++ )
        {
             if( num.charAt(first)=='0'&&second-first>1 )
             {
                 break;
             }
            for(third=second+1;len-third>=Math.max(second,third-second);third++)
            {
                if( num.charAt(second)=='0'&&third-second>1 )
                {
                    break;
                }
                int tmpFirst=first,tmpSecond=second,tmpThird=third;
                while( tmpThird<len )
                {
                    Long longFirst=Long.parseLong( num.substring(tmpFirst,tmpSecond) );
                    Long longSecond=Long.parseLong( num.substring(tmpSecond,tmpThird) );
                    Long sum=longFirst+longSecond;
                    if( num.substring(tmpThird).startsWith(sum.toString()) )
                    {
                        tmpFirst=tmpSecond;
                        tmpSecond=tmpThird;
                        tmpThird+=sum.toString().length();
                    }
                    else
                    {
                        break;
                    }
                }
                if( tmpThird==len )
                {
                    return true;
                }
            }
        }
        return false;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值