java 数组全排列(可包含重复元素)

本文介绍了一种用于生成字符串数组所有可能排列的算法,并通过去除重复排列来提高效率。该算法适用于含有重复元素的情况,通过计算索引来避免不必要的交换操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.Arrays;


/*理解全排序的过程,从begin到i-1的数据都与begin交换过, 
如果第i的数据与前面begin到i-1中的数据有重复,那么不用交换了 
设 a[i]=x 存在 a[j]=x , begin<=j<=i-1 
根据 全排列的递归公式知道 Perm(Ri)=Perm(Rj) 
所以 Perm(Ri)为重复的需要去掉 */


  
public class sortRAll {  
 // static String[] array = { "x", "y", "z" };  

  public static void main(String[] args) {  
 String[] array = { "1", "2", "2","3"}; 
    getAllOrder(array,0, array.length - 1);  
  }  
  public static void getAllOrder(String[] array,int begin, int end) {  
 
    if (begin == end) {  
      check(array);  
    } else {  
    String s=new String();
    /*for(int i=0;i<array.length;i++)
    s=s+array[i];*/
    for(int i=begin;i<end+1;i++)
    s=s+array[i];
    int index[]=new int[s.length()];
    for(int i=0;i<s.length();i++)
    index[i]=s.indexOf(s.charAt(i));   //index[i]<=i
   
      for (int i = begin; i <= end; i++) {  
        // 交换数据  
    if(i-begin==index[i-begin])                      //如果有重复 ,index[i]<i 则不交换 
    {
    swap(array,begin, i);    
            getAllOrder(array,begin + 1, end);  
            swap(array,i, begin);  
    }
      }  
    }  
  }  
  public static void swap(String[] array,int from, int to) {  
    // 这里应该加上各种防止无效交换的情况  
    // 比如位置相同,或者2个位置的数据相同  

    if (from == to) {  
      return ;  
    }  
    String tmp = array[from];  
    array[from] = array[to];  
    array[to] = tmp;  
    
  }  
  public static void check(String[] array) {  
    // 排列拿到了,可以进行你的判断了。  
    System.out.println(Arrays.toString(array));  
  }  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值