全排列Ⅰ(迭代&递归)

第十一届蓝桥杯国赛JavaC组中含有大量的全排列加检查
例如给你一串字符“ABC”
那么它的全排列就是:
ABC
ACB
BAC
BCA
CAB
CBA
那么如何来实现全排列呢?
以下分别使用迭代和递归来实现全排列

// An highlighted block
package 全排列;

import java.util.ArrayList;

public class 字符串全排列 {
    public static void main(String[] args) {
        String str = "ABC";
        ArrayList<String> res = new ArrayList<>();
        res.add(str.charAt(0) + "");
        ArrayList<String> strper = getStrper1(str, 1, res);
        ArrayList<String> strper1 = getStrper(str);
        for (String s : strper) {
            System.out.println(s);
        }
    }
//递归法实现全排列
    private static ArrayList<String> getStrper1(String str, int index, ArrayList<String> tmp) {
//  出口?
        if (index == str.length())
            return tmp;
        ArrayList<String> new_res = new ArrayList<>();
        for (String s :
                tmp) {
            String new_s = str.charAt(index) + "";
            new_res.add(new_s + s);
            new_res.add(s + new_s);
            for (int i = 1; i < s.length(); i++) {
                new_res.add(s.substring(0, i) + new_s + s.substring(i));
            }
//            到这里一种情况已经既定 需要更新res
        }
        return getStrper1(str, index + 1, new_res);
    }
    //    迭代法生成字符串全排列
        private static ArrayList<String> getStrper(String str) {
            ArrayList<String> arr = new ArrayList<>();
//        初始化为第一个字符
            arr.add(str.charAt(0)+"");
            for (int i = 1; i < str.length(); i++) {
                ArrayList<String> new_arr = new ArrayList<>();
                char new_c = str.charAt(i);
                for (String s:arr) {
//          拿一个字符出来放在前面
                    new_arr.add(new_c+s);
//          拿一个字符出来放在后面
                    new_arr.add(s+new_c);
//           加在中间
                    for (int j = 1; j <s.length(); j++) {
                        new_arr.add(s.substring(0,j)+new_c+s.substring(j));
                    }
                }arr = new_arr;
            }return arr;

        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值