• 字符串的全排列


    转自https://blog.csdn.net/qq_41056506/article/details/82659524

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

    首先,这里以数组为例。数组arr [1,2,3,4]
    1 2 3 4 为第一个
    然后保持1不变,对【2 3 4】 进行排列
    然后保持2 不变对【3 4】进行排列
    在保持3不变对4排列
    故排列为 【1 2 3 4】
    接下来 3 4互换 成 【1 2 4 3】
    同理得到
    【1 3 2 4】
    【1 3 4 2】
    【1 4 2 3】
    【1 4 3 2】
    这样以1开头的就排列完了
    然后在以2 3 4开投得到相应的排列就是全排列
    这样问题就可以分解成如下:对
    T=【x1,x2,x3,x4,x5,……..xn−1,xn】
    我们获得了在第一个位置上的所有情况之后(注:是所有的情况),对每一种情况,抽去序列T中的第一个位置,那么对于剩下的序列可以看成是一个全新的序列

    T1=【x2,x3,x4,x5,……..xn−1,xn】
    序列T1可以认为是与之前的序列毫无关联了。同样的,我们可以对这个T1进行与T相同的操作,直到T中只一个元素为止。这样我们就获得了所有的可能性。所以很显然,这是一个递归算法。

    第一位的所有情况:无非是将x1与后面的所有数x2,x3,…….xn依次都交换一次
    如图所示:

     

     

    这时还是右重复元素。这里我们可以用到集合Set,set存取不重复的元素。这样就可以把重复元素去掉。
    代码如下:

    package FullArr;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    /*
     *全排列
     *输入一个字符串,按字典序打印出该字符串中字符的所有排列。
     *例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
     * */
    public class FullArr {
        public ArrayList<String> Permutation(String str) {
               Set<String> set=new HashSet<>();
               ArrayList<String> list=new ArrayList<>();
               if (str==null||str.length()==0) {
                   return list;
               }
               fullArr(set,str.toCharArray(),0);
               list.addAll(set);
               Collections.sort(list);
               return list;
        }
        public static void fullArr(Set<String> set,char[] ch,int start) {
            if (start==ch.length) {
                set.add(new String(ch));
            }
            else {
                for(int i=start;i<ch.length;i++) {
                    swap(ch, start, i);
                    fullArr(set, ch, start+1);
                    swap(ch, start, i);
                }
            }
        }
        public static void swap(char[] ch,int start,int end) {
            char temp=ch[start];
            ch[start]=ch[end];
            ch[end]=temp;
        }
        public static void main(String[] args) {
            String str="aba";
            FullArr fullArr=new FullArr();
            List<String> list=fullArr.Permutation(str);
            for(String string:list) {
                System.out.println(string);
            }
        }
    }
  • 相关阅读:
    A B
    hdu 4656 Evaluation [任意模数fft trick]
    bzoj 3451: Tyvj1953 Normal [fft 点分治 期望]
    bzoj 3509: [CodeChef] COUNTARI] [分块 生成函数]
    hdu 5730 Shell Necklace [分治fft | 多项式求逆]
    hdu 4609 3-idiots [fft 生成函数 计数]
    UVA 12633 Super Rooks on Chessboard [fft 生成函数]
    Codeforces Round #410 (Div. 2)
    形式幂级数 [学习笔记]
    Python 字符串前面加u,r,b,f的含义
  • 原文地址:https://www.cnblogs.com/wzj4858/p/15860196.html
Copyright © 2020-2023  润新知