字符串或数组元素全排列的两种做法

前言

    最近在写算法题中,遇见不少关于排列的题目,所以在此记录一下我常用的两种全排列方法。

  • 借助Java中的substring方法进行递归(局限于Java且效率不高,建议看第二种方法)
复制代码
public static List arrange(String s){
        List list = new Vector();//用于保存全排列的结果
        
        if(s.length() == 1){//递归的出口
            list.add(s);
            return list;
        }
        for (int i = 0; i < s.length(); i++) {
            char temp = s.charAt(i);//将第i个字符取出保存
            List t = arrange(s.substring(0,i)+s.substring(i+1));//然后将剩下的0到i-1和i+1到最后的字符拼接在一起,然后将这个拼接的字符串进行全排列,结果用List来保存
            for (int j = 0; j < t.size(); j++) {//遍历上一步得到的全排列集合
                list.add("" + temp + t.get(j));//然后将第i个字符与剩下元素全排列的结果进行拼接,并添加到list中,用于返回
            }
        }
        return list;//将全排列结果返回
 }
  • 将字符数组中的某个元素取出然后与后面的元素逐个互换(通用性好且效率高)
复制代码
public static void arrange(char[] chars,int k){
        if(k == chars.length-1){
            System.out.println(String.valueOf(chars));//将排列结果打印输出
            return;
        }
        for (int i = k; i < chars.length; i++) {
            {char temp = chars[k];chars[k] = chars[i];chars[i] = temp;}//试探(将第k个元素取出,然后依次与后面的元素进行交换)
            arrange(chars,k+1);//当前k交换完毕后,进行下一个
            {char temp = chars[k];chars[k] = chars[i];chars[i] = temp;}//回溯(为不影响后面元素的交换必须进行回溯)
        }
}

示例程序如下

复制代码
import java.util.List;
import java.util.Vector;

public class Main{
    public static void main(String[] args) {
        arrange("abc".toCharArray(),0);
        System.out.println("-------------------------");
        List list = arrange("abc");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
    public static void arrange(char[] chars,int k){
        if(k == chars.length-1){
            System.out.println(String.valueOf(chars));//将排列结果打印输出
            return;
        }
        for (int i = k; i < chars.length; i++) {
            {char temp = chars[k];chars[k] = chars[i];chars[i] = temp;}//试探
            arrange(chars,k+1);
            {char temp = chars[k];chars[k] = chars[i];chars[i] = temp;}//回溯
        }
    }
    public static List arrange(String s){
        List list = new Vector();//用于保存全排列的结果

        if(s.length() == 1){//递归的出口
            list.add(s);
            return list;
        }
        for (int i = 0; i < s.length(); i++) {
            char temp = s.charAt(i);//将第i个字符取出保存
            List t = arrange(s.substring(0,i)+s.substring(i+1));//然后将剩下的0到i-1和i+1到最后的字符拼接在一起,然后将这个拼接的字符串进行全排列,结果用List来保存
            for (int j = 0; j < t.size(); j++) {//遍历上一步得到的全排列集合
                list.add("" + temp + t.get(j));//然后将第i个字符与剩下元素全排列的结果进行拼接,并添加到list中,用于返回
            }
        }
        return list;//将全排列结果返回
    }
}
posted @   Alex-jzw  阅读(500)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示