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

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;
   }
  }
 }
}

这是在网上找的代码,但是看不太懂,有哪位大神可以详细讲下思路吗?比如每一步的目的是什么,主要是递归那里真的想不通了

慕粉3233872
浏览 1723回答 1
1回答

Frank_W毅3947945

    首先说一下, 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元素进行排列组合。并列出所有可能的排列值
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java