【Lintcode】680. Split String把原有string分拆成小的string

描述
给一个字符串,你可以选择在一个字符或两个相邻字符之后拆分字符串,使字符串由仅一个字符或两个字符组成,输出所有可能的结果

样例
样例1

输入: "123"
输出: [["1","2","3"],["12","3"],["1","23"]]
样例2

输入: "12345"
输出: [["1","23","45"],["12","3","45"],["12","34","5"],["1","2","3","45"],["1","2","34","5"],["1","23","4","5"]

 

思路:就是dfs。以前写过:后面的子串长度i + 1,会带着pos + 1。所以只要for一次就行了。

 

变形:

第二题:给一个 string, 随意添加空格,把原有 string 分拆成小的string,输出所有可能结果。
比如 "abc", 分拆成 [["ab","c"], ["a","bc"], ["a","b","c"]]

长度可以不限于<=2

参考和感谢:https://blog.csdn.net/qq_46105170/article/details/105549283

 

import java.util.ArrayList;
import java.util.List;

public class Solution {
    /*
     * @param : a string to be split
     * @return: all possible split string array
     */
    public List<List<String>> splitString(String s) {
        // write your code here
        List<List<String>> res = new ArrayList<>();
        dfs(s, 0, new ArrayList<>(), res);
        return res;
    }
    
    // 从s的s[pos]开始,向后分割出一个或两个字符的子串,加入cur;res储存最后的答案
    private void dfs(String s, int pos, List<String> cur, List<List<String>> res) {
        // 如果pos到达了字符串尾,说明已经切割完毕,则将切割的结果加入res
        if (pos == s.length()) {
            res.add(new ArrayList<>(cur));
            return;
        }
        // 开始枚举从pos后分割长度为1或2的子串,加入cur,并进入下一层递归
        // 递归结束后要记得回溯,恢复现场
        for (int i = pos; i < pos + 2 && i < s.length(); i++) {
            cur.add(s.substring(pos, i + 1));
            dfs(s, i + 1, cur, res);
            cur.remove(cur.size() - 1);
        }
    }
}
————————————————
版权声明:本文为CSDN博主「记录算法」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_46105170/article/details/105549283
View Code

 

posted @ 2021-02-26 13:08  苗妙苗  阅读(83)  评论(0)    收藏  举报