[LeetCode]Additive Number

題目鏈接:Additive Number
題目內容:

Additive number is a positive integer whose digits can form additive sequence.

A valid additive sequence should contain at least three numbers. Except for the first two numbers, each subsequent number in the sequence must be the sum of the preceding two.

For example:
“112358” is an additive number because 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
“199100199” is also an additive number, the additive sequence is: 1, 99, 100, 199.
1 + 99 = 100, 99 + 100 = 199
Note: Numbers in the additive sequence cannot have leading zeros, so sequence 1, 2, 03 or 1, 02, 3 is invalid.

Given a string represents an integer, write a function to determine if it’s an additive number.

Follow up:
How would you handle overflow for very large input integers?

題目解法

這是一道典型的枚舉問題,可以用回溯法解決。
回溯的策略爲,在開始時從長度爲1的字串開始枚舉,設這個值爲s1,然後從剩下的部分中繼續從長度爲1開始枚舉,設這個值爲s2,此時餘下的部分爲s3,如果s1+s2(代數和)所對應的字符串在s3中能找到,並且這個字串在s3的開頭,則說明找到了符合條件的部分序列,接着讓s2=s1,重複這個過程。終止條件爲在s3中拿掉s1+s2所對應的字符串後長度爲0。
我們的遞歸函數參數如下:

void DFS(int len,string num,string s1);

len代表的是從頭開始查找時,對s1長度的枚舉。在後序的查找中,由於s1取自上次的s2,因此len不在對s1起作用,但是注意到len會影響是否在剩餘串中去掉s1,因此再後序遞歸中len必須傳入0。爲了區分從頭開始的查找與中間的查找,我們在第一次進入DFS時s1傳入"",因爲中間查找時s1傳入的值爲剛找到的s2,因此不會爲""

代碼如下:

class Solution {
private:
    bool m_res;
public:
    long long str2num(string str){
        stringstream ss(str);
        long long n;
        ss >> n;
        return n;
    }
    string num2str(long long num){
        stringstream ss;
        ss << num;
        return ss.str();
    }
    void DFS(int len,string num,string s1){
        if(s1 == "") s1 = num.substr(0,len);
        if(s1.length() > 1 && s1[0] == '0') return;
        string left = num.substr(len);
        int leftLen = left.length();
        for(int i = 1; i < leftLen; i++){
            string s2 = left.substr(0,i);
            if(s2.length() > 1 && s2[0] =='0') return;
            string sum = num2str(str2num(s1) + str2num(s2));
            string subleft = left.substr(i);
            int subpos = subleft.find(sum);
            if(subpos == 0){
                string finalLeft = subleft.substr(sum.length());
                int subLen = finalLeft.length();
                if(subLen == 0){
                   m_res = true;
                   return;
                }
                DFS(0,subleft,s2);
            }
        }
    }
    bool isAdditiveNumber(string num) {
        vector<string> res;
        int len = num.length();
        m_res = false;
        for(int i = 1; i < len - 1;i++){
            DFS(i,num,"");
            if(m_res) return true;
        }
        return false;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章