JAVA程序设计:累加数(LeetCode:306)

累加数是一个字符串,组成它的数字可以形成累加序列。

一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。

给定一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是累加数。

说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。

示例 1:

输入: "112358"
输出: true 
解释: 累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
示例 2:

输入: "199100199"
输出: true 
解释: 累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199
进阶:
你如何处理一个溢出的过大的整数输入?

思路:典型的回溯题,因为进阶的要求,我们可以考虑加入字符串加法避免大整数溢出。

class Solution {
	
	int n;
	String s;
	
    public boolean isAdditiveNumber(String num) {
    	
    	s=num;
    	n=s.length();
    	return backtrack(-1,2);
    	
    }
    
    public boolean backtrack(int prev_pos,int dots)
    {
    	for(int i=prev_pos+1;i<n;i++)
    	{
    		if(dots==1)
    		{
    			if(s.charAt(prev_pos+1)=='0' && i-prev_pos>1) return false;
    			if(isValid(prev_pos,i)) return true;
    		}
    		else if(backtrack(i,dots-1)) return true;
    	}
    	return false;
    }
    
    public boolean isValid(int first,int second)
    {
    	int pre_first=-1;
    	while(second<n)
    	{
    		String num1=s.substring(pre_first+1,first+1);
    		String num2=s.substring(first+1, second+1);
    		String next=stringAdd(num1,num2);
    		
    		int length=next.length();
    		if(second==n-1 && pre_first!=-1) return true;
    		if(second+length+1<=n && s.substring(second+1, second+length+1).equals(next))
    		{
    			pre_first=first;
    			first=second;
    			second=second+length;
    		}
    		else
    			return false;
    	}
    	return false;
    }
    
    public String stringAdd(String str1,String str2)
    {
    	if(str1.length()<str2.length())
    		return stringAdd(str2,str1);
    	
    	int size1=str1.length();
    	int size2=str2.length();
    	StringBuilder sb=new StringBuilder();
    	for(int i=0;i<size1-size2;i++)
    		sb.append('0');
    	str2=sb+str2;
    	
    	StringBuilder result=new StringBuilder(str1);
    	int sgn=0;
    	for(int i=size1-1;i>=0;i--)
    	{
    		int num=str1.charAt(i)-'0'+str2.charAt(i)-'0'+sgn;
    		result.setCharAt(i, (char)(num%10+'0'));
    		sgn=num/10;
    	}
    	return sgn==1?"1"+result:new String(result);
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值