java求一个字符串的全排列(并去除重复的排列)

3 篇文章 0 订阅
1 篇文章 0 订阅

java递归实现一个字符串的全排列并去掉重复的排列

算法:递归实现
代码如下:
package com.ibianma.zifuchuan;

import java.lang.String;

public class FullPermutation {
    /**
     * 将索引为i与j处的字符交换
     * @param chars 字符数组
     * @param i 字符下标
     * @param j 字符下标
     */
    private static void exChange(char[] chars,int i,int j){
        char temp = chars[i];
        chars[i]=chars[j];
        chars[j]=temp;
    }

    /**
     * 递归求全排列
     * @param chars 字符数组
     * @param start 待排序字符的首字符下标
     */
    private static void permitation(char[] chars,int start){
        if (chars==null||start<0)
            return;
        //完成全排列后输出当前字符串
        if (start==chars.length){
            System.out.println(chars);
        }
        else {
            for (int i = start; i <chars.length ; i++) {
                //如果当前字符和之后的字符相同,跳过本次循环
                if (!isDuplicate(chars,start,i))
                    continue;
                //交换start与i所在位置的字符
                exChange(chars,start,i);
                //固定第一个字符,对剩下的字符进行全排列
                permitation(chars,start+1);
                //排列结束后,还原字符对应的位置
                exChange(chars,start,i);
            }
        }
    }

    /**
     * 判断begin与end之间是否有字符相同
     * @param str 字符数组
     * @param begin 开始字符
     * @param end 结束字符
     * @return true,如果有相同的字符返回false
     */
    private static boolean isDuplicate(char[] str,int begin,int end ){
        for (int i = begin; i <end ; i++) {
            if (str[i]==str[end])
                return false;
        }
        return true;
    }

    /**
     * 全排列方法
     * @param str 带排列的字符串
     */
    public static void permitation(String str){
        char[] chars = str.toCharArray();
        permitation(chars,0);
    }

    public static void main(String[] args) {
        String str = new String("abcc");
        permitation(str);
    }
}


结果如下:
abcc
acbc
accb
bacc
bcac
bcca
cbac
cbca
cabc
cacb
ccab
ccba

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值