306. Additive Number/842. Split Array into Fibonacci Sequence -- back tracking

306. Additive Number
Input: "112358" Output: true Explanation: The digits can form an additive sequence: 1, 1, 2, 3, 5, 8.   1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8

题意:把一个字符串拆分,a[i-1]+a[i-2] = a[i]
分析: sting 长度 <3 一定不行,
剪枝: 1.在拆分过程中就要去计算前后是否符合,不符合就直接break, 否则TLE。
2. 在dfs 过程中如果发现符合条件的就不需要继续dfs了。
3.数字开头不能有leading zero, 例如:”01“
4.因为字符串长度很长,所以得用Long 而不是int 否则会溢出。

class Solution {
    public boolean isAdditiveNumber(String num) {
        int len = num.length();
        if(len<3) return false;
        return dfs(new ArrayList<>(), num, 0);        
    }
    
    private boolean dfs(List<Long> curResult,  String s, int start){
        if(curResult.size() >=3 && start==s.length()){
            return true;
        }
         
        boolean flag = false;
        for(int i=1; i<=s.length()-2; i++){     
            if(start+i >s.length()) break;
            int size = curResult.size();
            String substr = s.substring(start,start+i);
            if(substr.length()>1 && substr.charAt(0) == '0') continue; 
            long subnum = Long.valueOf(substr);
            if(size>=2) if(curResult.get(size-1) + curResult.get(size-2) != subnum) continue;
            curResult.add(subnum);
            start += i;
            flag = flag || dfs(curResult,s,start);
            if(flag) return true;
            curResult.remove(curResult.size()-1);
            start -=i;
        } 
        return flag;
    }
    
    }

842. Split Array into Fibonacci Sequence

         和306几乎一样的代码,只是需要return 结果,而不是判断是否符合条件。

         结果必须得是 Integer ,因此 字符串长度 不会 长于 Integer 长度10. 因此加了 for(int i=1; i<=(s.length()-2 <10? s.length()-2:10); i++) 进行减枝。

         即使长度为10,仍然可能超过 Integer 范围,因此 需要 加判断 "if(subnum > Integer.MAX_VALUE) continue;"

      

class Solution {
    public List<Integer> splitIntoFibonacci(String S) {
        List<Integer> result = new ArrayList<>();
        if(S.length()<3 ) return result;

        dfs(result, S,0);
        return result;
    }
    
    
    private boolean dfs(List<Integer> curResult,  String s, int start){
        if(curResult.size() >=3 && start==s.length()){
            return true;
        }
         
        boolean flag = false;
        for(int i=1; i<=(s.length()-2 <10? s.length()-2:10); i++){     
            if(start+i >s.length()) break;
            int size = curResult.size();
            String substr = s.substring(start,start+i);
            if(substr.length()>1 && substr.charAt(0) == '0') continue; 
            long subnum = Long.valueOf(substr);
            if(subnum > Integer.MAX_VALUE) continue;
            if(size>=2) if(curResult.get(size-1) + curResult.get(size-2) != subnum) continue;
            curResult.add((int)subnum);
            start += i;
            flag = flag || dfs(curResult,s,start);
            if(flag) return true;
            curResult.remove(curResult.size()-1);
            start -=i;
        } 
        return flag;
    }
}

    

猜你喜欢

转载自www.cnblogs.com/keepAC/p/9967201.html
今日推荐