这位同学,代码的31行到36行出现了问题,可能是你对引用类型的理解存在一点偏差,其实从getString(ArrayList<Character> al,String st)开始,你操作的都是同一个al,不知道这样说你是否能够理解,因为你每次都是在将这个al的引用传递给下一次递归。也就是说从头开始都是在删除al集合中的内容,所以第一次完整的递归,即st=“”->st="a"->st="ab"->st="abc"之后,al集合中已经没有内容了,所以就结束了。
这是我修正之后的代码,就是在这里将al复制了一份,操作复制的即可。
- private static void getString(ArrayList<Character> al,String prefix)
- {
- for(int index=0;index<al.size();index++)
- {
- ArrayList<Character> alCopy = new ArrayList<Character>();
- alCopy.addAll(al);
- String str=prefix+alCopy.get(index);
- System.out.println(str);
- alCopy.remove(index);
- getString(alCopy,str);
- }
- }
复制代码
,另外,我自己也写了一个,不过没有使用ArrayList,使用的是StringBuilder.咱们的思想应该是差不多的,我也是将字符串进行分成两部分,一个是前缀,另外一个是剩下的串。
- public class Test {
- private static int count=0;
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- getDiffCombination("","abc");
- System.out.println(count);
- }
-
- /**
- * 整体的思维方式是,将串分成两部分,一部分为前缀,即 不需要修改的,另外一部分是剩下的串,
- * 如果剩下的串的长度为1,那么构成规则便只有一种,就是前缀+剩下的长度为1的串
- * 否则,便可以将剩下的串进行再次分割,将剩下的串的每一位拼接到前缀,递归寻找结果
- * @param prefix 字符串的构成前缀
- * @param strLeft 剩下的字符串
- */
- private static void getDiffCombination(String prefix,String strLeft){
- if(strLeft.length()==1){
- System.out.println(prefix+strLeft);
- count++;
- return;
- }
-
- for(int i=0;i<strLeft.length();i++){
- StringBuilder sb = new StringBuilder(strLeft);
- String str = prefix+strLeft.substring(i, i+1);
- System.out.println(str);
- count++;
- getDiffCombination(str,sb.deleteCharAt(i).toString());
- }
- }
- }
复制代码
希望能够帮到你 |