欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LintCode-680: Split String DFS 经典题

程序员文章站 2022-03-24 17:20:45
...

我用的经典DFS回溯方法,见下图:
LintCode-680: Split String DFS 经典题

代码如下:

class Solution {
public:
    /*
     * @param : a string to be split
     * @return: all possible split string array
     */
    vector<vector<string>> splitString(string& s) {
        vector<vector<string> > results;
        if (s.empty()) {
            results.push_back(vector<string>());
            return results;
        }

        vector<string> sol;
        helper(s, 0, sol, results);
        return results;
    }

private:
    void helper(string&s, int index, vector<string> &sol, vector<vector<string>> &results) {
        if (index >= s.size()) {
            results.push_back(sol);
            return;
        }

        if (index < s.size()) {
            sol.push_back(s.substr(index, 1));
            helper(s, index + 1, sol, results);
            sol.pop_back();
        }

        if (index < s.size() - 1) {
            sol.push_back(s.substr(index, 2));
            helper(s, index + 2, sol, results);
            sol.pop_back();
        }
    }
};

这里注意:
1) if (index >= s.size()) 用==也可以。
2)记得要加上
if (index < s.size()) {

if (index < s.size() - 1)
第一个if可省,第二个不可省。否则
Output
[[“1”,”23”],[“12”,”3”],[“12”,”3”],[“1”,”2”,”3”],[“1”,”2”,”3”]]
Expected
[[“1”,”23”],[“12”,”3”],[“1”,”2”,”3”]]
因为当sol={“12”}时,如果不加限制,以下代码仍会调用

            sol.push_back(s.substr(index, 2));
            helper(s, index + 2, sol, results);
            sol.pop_back();

这里虽然substr(index,2)已经越界,但不会报错,substr会返回到末尾的子字符串。然后调用helper(,index+2,..),进去后会将sol存在result中,造成重复。
3) if (index < s.size() - 1) 里面记得要pop_back(),这样才能回溯。

另外,这个解法可以简化成下面的经典方法,这样,分成1..n的子字符串的问题都适用。

    void helper(string&s, int index, vector<string> &sol, vector<vector<string>> &results) {
        if (index == s.size()) {
            results.push_back(sol);
            return;
        }

        for (int i = 1; i < 3; ++i) {
            if (index + i <= s.size()) {
                sol.push_back(s.substr(index, i));
                helper(s, index + i, sol, results);
                sol.pop_back();
            }
        }
    }
相关标签: LintCode