491,回溯演算法解將陣列拆分成斐波那契序列

2021-10-14 12:37:35 字數 2741 閱讀 8726

問題描述

給定乙個數字字串s,比如s= 「123456579」,我們可以將它分成斐波那契式的序列[123, 456, 579]。

形式上,斐波那契式序列是乙個非負整數列表 f,且滿足:

另外,請注意,將字串拆分成小塊時,每個塊的數字一定不要以零開頭,除非這個塊是數字 0 本身。

返回從 s 拆分出來的任意一組斐波那契式的序列塊,如果不能拆分則返回 。

示例 1:

輸入:「123456579」

輸出:[123,456,579]

示例 2:

輸入: 「11235813」

輸出: [1,1,2,3,5,8,13]

示例 3:

輸入: 「112358130」

輸出:

解釋: 這項任務無法完成。

示例 4:

輸入:「0123」

輸出

解釋:每個塊的數字不能以零開頭,因此 「01」,「2」,「3」 不是有效答案。

示例 5:

輸入: 「1101111」

輸出: [110, 1, 111]

解釋: 輸出 [11,0,11,11] 也同樣被接受。

回溯演算法解決這題是讓把字串s拆成一些子串,並且這些子串滿足斐波那契數列的關係式。對於這道題我們可以使用回溯演算法來解決,回溯演算法其實就是不斷嘗試的過程,一旦嘗試成功了,就算成功了,如果嘗試失敗了還會回到上一步,注意回到上一步的時候還要把狀態還原到上一步的狀態。回溯演算法這裡就不在過多介紹,關於回溯演算法的解題思路可以看下450,什麼叫回溯演算法,一看就會,一寫就廢。

回溯演算法其實有乙個經典的模板

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...