描述
给一个字符串,你可以选择在一个字符或两个相邻字符之后拆分字符串,使字符串由仅一个字符或两个字符组成,输出所有可能的结果
样例
样例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