306. Additive Number/842. Split Array into Fibonacci Sequence -- back tracking
阿新 • • 發佈:2018-11-16
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; } }