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

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));  
  }  
}  

版权声明:本文为hlh522521原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。