目錄
一、題目描述
二、解題思路
三、**實現
給定乙個數字字串 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] 也同樣被接受。
1 <= s.length <= 200
字串 s 中只含有數字。
這題是經典的回溯演算法的題。
個人經驗是學習任何一種新的演算法思想,在理解了理論知識後加以適當的練習,才能把這種思想熟練的掌握,如果練題量不足的話,後面遇到經典直接的題也許會做,但是如果稍加變化,可能就不會做了。練題的目的是為了積累經驗,有了經驗之後做題就是記憶反射加上一些小變化了。沒錯,說的就是我練題不夠…
關於回溯演算法,個人的一些小經驗(練題並不多,並不能保證正確):
回溯演算法有兩種基本特徵:
1、每一步可能有多個可選項,一開始時並不知道該選哪乙個(選哪乙個都有可能);
2、每一步的選擇有連鎖反應,當某一步的選擇不滿足要求時則需要回退一步再繼續選擇試探。
說回本題,本題的可選項是選擇哪幾個字元構建成乙個數字並不確定,只有當所有的數字都構建完了,並且滿足斐波那契數列的形式則算構建成功;所以只有迴圈遍歷所有可能的字串字首,檢視是否滿足要求,如果滿足要求就把構建的陣列返回。另外注意dfs剪枝的情況:數字不能有前置0;整形和存在越界情況。
#include using namespace std;
vectorres;
bool backtrack(string s, int index)
//劃分不成功說明需要回溯
res.pop_back();
} }return false;
}vectorsplitintofibonacci(string s)
int main()
return 0;
}
LeetCode 824 山羊拉丁文
隨機一題 給定乙個由空格分割單詞的句子s。每個單詞只包含大寫或小寫字母。我們要將句子轉換為 goat latin 一種類似於 豬拉丁文 pig latin 的虛構語言 山羊拉丁文的規則如下 如果單詞以子音字母開頭 即非母音字母 移除第乙個字元並將它放到末尾,之後再新增 ma 例如,單詞 goat 變...
leetcode 824 山羊拉丁文
給定乙個由空格分割單詞的句子s。每個單詞只包含大寫或小寫字母。我們要將句子轉換為 goat latin 一種類似於 豬拉丁文 pig latin 的虛構語言 山羊拉丁文的規則如下 如果單詞以子音字母開頭 即非母音字母 移除第乙個字元並將它放到末尾,之後再新增 ma 例如,單詞 goat 變為 oat...
LeetCode 824 山羊拉丁文
給定乙個由空格分割單詞的句子 s。每個單詞只包含大寫或小寫字母。我們要將句子轉換為 goat latin 一種類似於 豬拉丁文 pig latin 的虛構語言 山羊拉丁文的規則如下 返回將s轉換為山羊拉丁文後的句子。示例 1 輸入 i speak goat latin 輸出 imaa peaksma...