問題描述
給定乙個數字字串s,比如s= 「123456579」,我們可以將它分成斐波那契式的序列[123, 456, 579]。
形式上,斐波那契式序列是乙個非負整數列表 f,且滿足:
另外,請注意,將字串拆分成小塊時,每個塊的數字一定不要以零開頭,除非這個塊是數字 0 本身。
返回從 s 拆分出來的任意一組斐波那契式的序列塊,如果不能拆分則返回 。
示例 1:
輸入:「123456579」示例 2:輸出:[123,456,579]
輸入: 「11235813」示例 3:輸出: [1,1,2,3,5,8,13]
輸入: 「112358130」示例 4:輸出:
解釋: 這項任務無法完成。
輸入:「0123」示例 5:輸出:
解釋:每個塊的數字不能以零開頭,因此 「01」,「2」,「3」 不是有效答案。
輸入: 「1101111」回溯演算法解決這題是讓把字串s拆成一些子串,並且這些子串滿足斐波那契數列的關係式。對於這道題我們可以使用回溯演算法來解決,回溯演算法其實就是不斷嘗試的過程,一旦嘗試成功了,就算成功了,如果嘗試失敗了還會回到上一步,注意回到上一步的時候還要把狀態還原到上一步的狀態。回溯演算法這裡就不在過多介紹,關於回溯演算法的解題思路可以看下450,什麼叫回溯演算法,一看就會,一寫就廢。輸出: [110, 1, 111]
解釋: 輸出 [11,0,11,11] 也同樣被接受。
回溯演算法其實有乙個經典的模板
private
void
backtrack
("原始引數"
)for
(int i =
"for迴圈開始的引數"
; i <
"for迴圈結束的引數"
; i++
)}
對於這道題也一樣,我們先把字串不斷的擷取,看一下能不能構成斐波那契序列,如果不能就回到上一步,如果能就繼續往下走,具體我們看下下面的圖,這裡是參照示例1為例畫的乙個圖,只不過數字縮短了,只有124557,因為如果數字比較多的話,圖太大,畫不下。
搞懂了上面的原理,**就簡單多了,我們來看下**
public list
splitintofibonacci
(string s)
public
boolean
backtrack
(char
digit, list
res,
int index)
for(
int i = index; i < digit.length; i++
)//擷取字串轉化為數字
long num =
subdigit
(digit, index, i +1)
;//如果擷取的數字大於int的最大值,則終止擷取
if(num > integer.max_value)
int size = res.
size()
;//如果擷取的數字大於res中前兩個數字的和,說明這次擷取的太大,直接終止,因為後面越擷取越大
if(size >=
2&& num > res.
get(size -1)
+ res.
get(size -2)
)if(size <=
1|| num == res.
get(size -1)
+ res.
get(size -2)
)}return
false;}
//相當於擷取字串s中的子串然後轉換為十進位制數字
private
long
subdigit
(char
digit,
int start,
int end)
return res;
}
總結真正有模板的演算法題型其實不多,但回溯演算法算是其中的乙個,只不過對於不同的題型要做不同的修改,只要掌握了這個模板,對於很多回溯演算法題型稍加修改,我們就很容易做出來。 字串拆分成陣列 842將陣列拆分成斐波那契數列
這個 星期六要考四級,真的是花36塊錢體驗下卷子。上次去華南理工比數學競賽,沒想到成功混了乙個一等獎 首先來看看題目 給定乙個數字字串 s,比如 s 123456579 我們可以將它分成斐波那契式的序列 123,456,579 形式上,斐波那契式序列是乙個非負整數列表 f,且滿足 0 f i 2 3...
Leetcode 842 將陣列拆分成斐波那契序列
給定乙個數字字串 s,比如 s 123456579 我們可以將它分成斐波那契式的序列 123,456,579 形式上,斐波那契式序列是乙個非負整數列表 f,且滿足 0 f i 2 31 1,也就是說,每個整數都符合 32 位有符號整數型別 f.length 3 對於所有的0 i f.length 2...
842 將陣列拆分成斐波那契序列
給定乙個數字字串 s,比如 s 123456579 我們可以將它分成斐波那契式的序列 123,456,579 形式上,斐波那契式序列是乙個非負整數列表 f,且滿足 0 f i 2 31 1,也就是說,每個整數都符合 32 位有符號整數型別 f.length 3 對於所有的0 i f.length 2...