全排列递归(解决了重复字符问题)

网上有很多讲解全排列递归的算法思路以及程序,所以在此本菜鸟就不再写一遍了。

今天的重点在解决重复字符方面,感觉网上博客里的解决思路大都一致,写一个isSwap函数,然后在递归主体里判断一下函数返回true还是false,大神们也都po出了程序运行图。然而我这么写的程序最终跑不出来预期结果,因此我分析了一下,觉得可以有一个更为简单的办法去重。

要点就是:如果发现待交换的两个字符str[i] == str[k],并且i!=k时,就不交换了,如此即可去重

可运行代码如下(去重判断部分已加粗):

          public static ArrayList<String> Permutation(String str)
  {
  ArrayList<String> list = new ArrayList<String>();
  if(str==null || str.length()==0) return list;
  perm(list, str.toCharArray(), 0);
  
      return list;
  }
  public static void perm(ArrayList<String> list, char[] str, int k){
  //递归基
  if(k==str.length-1){
  String chars = new String(str);
  list.add(chars);
  return;
  }
  for(int i=k; i<str.length;i++){
  if(i==k || (str[i]!=str[k])){
     swap(str, k, i);
     perm(list, str, k+1);
     swap(str,k, i);
  }
  }
  
  }

  public static void swap(char[] str,int i,int j)
  {
    char temp = str[i];
    str[i]=str[j];
    str[j]=temp;
  }
  
  public static void main(String[] args){
  String string = "aba";
  ArrayList<String> list = Permutation(string);
  for(int i=0;i<list.size();i++)
  System.out.println(list.get(i));

  }

运行结果:


猜你喜欢

转载自blog.csdn.net/siri96/article/details/80729058