字符串的全排列

使用递归的方法求字符串的全排列是一个经典方法。本文采用图+代码的方式进行理解。


1. 思考的过程


2. 参考代码

package 第六章递归;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class _02字符串的全排列 {

     //使用TreeSet 去掉重复值
     static Set<String> set = new TreeSet<String>();
     public static void main (String[] args) {

           Scanner scanner = new Scanner(System. in);
           String str = scanner.nextLine();
            char[] charArray = str.toCharArray();
            //将字符数组转为字符串数组
           String[] strs = new String[charArray. length];
            for ( int i = 0; i < strs. length; i++) {
                strs[i] = String. valueOf(charArray[i]);
           }
           
            set = getPermutation(Arrays.asList(strs), "" );
            int count = 0;
            for (String string : set) {
                System. out.print(++count + string + "\t");
                 if(count%6==0){
                     System. out.println();
                }
           }
     }

     public static Set<String> getPermutation(List<String> candidate, String prefix){
            if(candidate.isEmpty()){
                System. out.println(prefix);
                 set.add(prefix);
           }
            for ( int i = 0; i < candidate.size(); i++) {
                 // LinkedList 删除操作较快
                List<String> temp = new LinkedList<>(candidate);
                 // remove返回的是删除的元素
                 // remove 之后,temp 传过去的值也是少了一个的容器。这样candidate渐渐变小,才能达到递归跳出条件
                 getPermutation(temp, prefix+temp.remove(i));           
           }
            return set;
     }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值