为了账号安全,请及时绑定邮箱和手机立即绑定

关于Java字符串全排列的问题

关于Java字符串全排列的问题

慕粉3233872 2016-11-23 10:34:10
import java.util.ArrayList; public class test {  static ArrayList<String> list = new ArrayList<>();  public static void main(String[] args) {   String[] strs = {"A","B","C","D"};   perm(strs, 0, strs.length);   for(String s:list){    System.out.println(s);   }   list.clear();  }    private static void perm(String[] strs,int start,int end){   String s = "";   if(start==end){    for(int i=0;i<strs.length;i++){     s+=strs[i];    }    list.add(s);   }else{    for(int i=start;i<end;i++){     String str = strs[start];     strs[start] = strs[i];     strs[i] = str;     perm(strs,start+1,end);     strs[i] = strs[start];     strs[start] = str;    }   }  } }这是在网上找的代码,但是看不太懂,有哪位大神可以详细讲下思路吗?比如每一步的目的是什么,主要是递归那里真的想不通了
查看完整描述

1 回答

已采纳
?
Frank_W毅3947945

TA贡献6条经验 获得超3个赞

    首先说一下, static ArrayList<String> list = new ArrayList<>();泛型掉了类型,应该是 new ArrayList<String>();

    再说递归,

    for(int i=start;i<end;i++){

    String str = strs[start];

    strs[start] = strs[i];

    strs[i] = str;

    perm(strs,start+1,end);

    strs[i] = strs[start];

    strs[start] = str;

    先说下递归算法的特点:代码简洁,但逻辑性比较强,理解起来要难一些。再说一下这段程序,关键是上面这段代码的理解,相信你其他的应该都可以看懂。这段代码是指先交换数组strs[i]和strs[start]的值(注意:这个时候数组strs[i]和strs[start]的值已经互换了,已经改变了),再对satrt加一,进行函数递归,最后又把strs[i]和strs[start]的值还原回来(这个时候恢复成为原来的数组)。当start==end的时候,list列表添加入此时数组strs的所有字符串。说的可能比较抽象,你不妨试试几组数据,分别把start,end 设为0,2;0,3;1,3;1;4自己试着写一下,找到思路。这个程序主要是对数组内元素,第start到end元素进行排列组合。并列出所有可能的排列值

查看完整回答
1 反对 回复 2016-11-26
  • TheLast1996
    TheLast1996
    perm(strs, 0, strs.length); for(String s:list){ System.out.println(s); } list.clear(); } 什么意思这段
  • Frank_W毅3947945
    Frank_W毅3947945
    perm(strs, 0, strs.length);是调用下面的perm函数呀,3个参数值分别是strs(创建的数组),0(起始位置),strs.length(终止位置,也就是整个数组了),for(String s:list){ System.out.println(s); },把list里每个元素遍历一遍并赋值给s,打印输出s,也就是说依次输出list里面每一个元素的内容,list.clear();清空list
  • 1 回答
  • 0 关注
  • 1717 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信