zoukankan      html  css  js  c++  java
  • 字符串全排列问题

    问题:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

    输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

    解决思路:第一遍将第一个字母固定,遍历所有字母,与第一个字母交换位置,然后固定下一个字母,与其后的所有字母依次交换位置,直到固定最后一个字母。

    字符串的全排列是一个概率问题,排除相同字母造成的影响,比如abc的全排列个数为A33 = 6个;

    再比如字符串“YONYOU”,先拍出现一次的字母,再排出现两次的字母,一共是A62C42C22,解释如下:有6个位置;先排N ,U有6*5=30种;再排Y,Y只有4个坑了有4*3/2=6种;最后2个位置给O,O,所以总共30*6=180种。

    算法采用递归算法:

     1 import java.util.ArrayList;
     2 import java.util.Collections;
     3 
     4 /**
     5  * 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
     6  * @author 王任义
     7  *
     8  */
     9 public class FullPermutation {
    10     public static void main(String[] args) {
    11         FullPermutation test = new FullPermutation();
    12         System.out.println(test.Permutation("alibaba"));
    13         System.out.println(test.count);
    14     }
    15     public ArrayList<String> Permutation(String str) {
    16         ArrayList<String> list = new ArrayList<String>();
    17         PermutationStr(str.toCharArray(),0,list);
    18         Collections.sort(list);
    19         return list;
    20     }
    21     public int count = 0;
    22     public void PermutationStr(char[] str,int times,ArrayList<String> list){
    23         if(times == str.length-1){
    24             String val = String.valueOf(str);
    25             if(!list.contains(val)){
    26 //                ++count;
    27 //                System.out.println(str);
    28                 list.add(val);
    29             }
    30             
    31         }else{
    32             for(int i = times;i<str.length;i++){
    33                 swap(str,times,i);
    34                 PermutationStr(str,times+1,list);
    35                 swap(str,times,i);
    36             }
    37         }
    38     }
    39     private void swap(char[] array,int one,int two){
    40         char tmp = array[one];
    41         array[one] = array[two];
    42         array[two] = tmp;
    43     }
    44 }

    虽然在开始的时候,递归在内存使用的是同一个char数组str,但是每次将递归完成的结果放到list当中的时候,并不是同一个对象,查看源码可以发现,String.valueOf(char[])方法最终是新建了一个数组对象,将参数中的值复制到String对象内置的value数组中。

     

     

  • 相关阅读:
    四,redis6版本的使用部署
    记录篇-浪潮服务器raid卡
    sudo漏洞解决方案--源码转rpm包(spec文件编写)
    关闭 Chrome 浏览器阅读清单功能
    【转译】如何成为一个数据工程师?
    Python 用最小堆获取大量元素 topk 大个元素
    Python 实现二分查找
    Python 排序算法之堆排序,使用 heapq 实现
    Python 排序算法之归并排序
    Python 排序算法之快速排序
  • 原文地址:https://www.cnblogs.com/w-honey/p/12285868.html
Copyright © 2011-2022 走看看