Java 将数字串分成1位数字和2位数字组

Java 将数字串分成1位数字和2位数字组,java,string,backtracking,Java,String,Backtracking,我试图将给定的数字串分解为较小的1位数字和2位数字。 大概是这样的: 输入:1234 输出:(1,2,34)(1,23,4)(1,2,3,4)(12,34)(12,3,4) 我一直试图用回溯法来解决这个问题,但没有得到完美的结果。我的尝试如下: import java.util.Arrays; import java.util.ArrayList; public class MyClass { private static void func(ArrayList<String

我试图将给定的数字串分解为较小的1位数字和2位数字。 大概是这样的:

输入:1234
输出:(1,2,34)(1,23,4)(1,2,3,4)(12,34)(12,3,4)

我一直试图用回溯法来解决这个问题,但没有得到完美的结果。我的尝试如下:

import java.util.Arrays;
import java.util.ArrayList;

public class MyClass {

    private static void func(ArrayList<String> res, String digits, String s){
        if(digits.length() <= 0){
            res.add(s.substring(0, s.length()-1));
            return;
        }

        String temp = digits;
        String prev_s = s;

        s = s  + digits.charAt(0) + ","; // chosen one character
        func(res, digits.substring(1), s);

        prev_s = s;

        if(digits.length() >= 2){
            s = s +  digits.substring(0,2) + ","; // chosen two characters
            func(res, digits.substring(2), s);
        }

        s = prev_s;
        digits = temp; // unchoosing
    }

    public static void main(String args[]) {

        String digits = "1234";
        ArrayList<String> res = new ArrayList<>();
        String s = "";
        func(res, digits, s);
        for(int i =0; i < res.size(); i++){
            System.out.println(res.get(i));
        }
    }       
}
1,2,3,4
1,2,3,34
1,2,23,4
1,12,3,4
1,12,3,34
我做错了什么?我想我在创建子字符串的时候把事情搞砸了

另外,这个问题可以不使用回溯来解决吗?
谢谢

您的问题是恢复
s
的分配方式错误:

prev_s=s→ <代码>s=上一个

仅此一项就能解决你的问题


除此之外:

  • 您不需要最后两条语句。他们什么也不做。
    记住,Java是按值传递的,所以在返回之前不需要恢复参数

  • 您不应该更改参数的值。相反,只需在递归方法调用中进行连接

  • 删除
    temp
    prev_s
    ,因为它们不再需要

  • 代码可以通过在逗号前加前缀而不是后缀来稍微简化

公共类MyClass{
私有静态void func(ArrayList res、字符串数字、字符串s){
if(digits.isEmpty()){
res.add(s.子字符串(1));
返回;
}
func(res,digits.substring(1),s+','+digits.charAt(0));
if(digits.length()>=2){
func(res,digits.substring(2),s+','+digits.substring(0,2));
}
}
公共静态void main(字符串参数[]){
ArrayList res=新的ArrayList();
func(res,“1234”和“);
for(字符串r:res){
系统输出println(r);
}
}
}
输出

1,2,3,4
1,2,34
1,23,4
12,3,4
12,34

你好,安德烈亚斯!谢谢你的回答和提示!这些对于像我们这样的新开发人员来说非常有用!