zoukankan      html  css  js  c++  java
  • 字符串的排列(剑指offer)

    题目描述:

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

    思路:

    利用回溯法循环(图为网络查找)

    以abc为例:

    • 开始循环,j=i=0,然后进入递归,j=i=1,i=i+1=2,满足if条件,然后将abc添加到list后第一次return到1(见代码处),是swap(ch,1,1),然后j=1+1=2,i=1,到2处swap(ch,1,2),即acb,然后将acb添加后第二次回到1,是swap(ch,1,2),即abc,然后j=2+1=3会退出本次递归
    • 继续循环,循环之前是2处i=0,j=0时进入递归,本次j=0+1=1,回到2处,swap(ch,0,1),即bac,进入递归,依次将bac,bca加入list中,然后回到bac,结束第二次递归
    •  继续循环,循环之前是2处i=0,j=1时进入递归,本次j=1+1=2,回到2 处,依次将cba,cab加入list,最后退出循环结束本次递归,由于j=3,所以也结束循环
    import java.util.*;
    public class Solution {
        public ArrayList<String> Permutation(String str) {
            ArrayList<String> list=new ArrayList();
            char [] ch=str.toCharArray();
           if(str.length()==0)
               return list;
            list.add(new String(ch));
            int i=0;
            fun(list,ch,i);
            Collections.sort(list);
            return list;
        }
        public void fun(ArrayList<String> list,char[] ch,int i){
            if(i==ch.length-1){
                if(!list.contains(new String(ch)))
                    list.add(new String(ch));
                    return;
            }
                for(int j=i;j<ch.length;++j){
                swap(ch,i,j);//2
                fun(list,ch,i+1);
                swap(ch,i,j);//1
            }
        }
        public void swap(char[] ch,int i,int j){
            if(i!=j){
            char temp=ch[i];
            ch[i]=ch[j];
            ch[j]=temp;
            }
        }
    }
    作者:wuba
    出处:http://www.cnblogs.com/wuba/
    版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议。转载请注明出处!
  • 相关阅读:
    简明Python3教程 12.问题解决
    简明Python3教程 11.数据结构
    【SPOJ 694】Distinct Substrings
    【codeforces Manthan, Codefest 17 C】Helga Hufflepuff's Cup
    【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring
    【CF Manthan, Codefest 17 A】Tom Riddle's Diary
    【SPOJ 220】 PHRASES
    【POJ 3261】Milk Patterns
    【POJ 3294】Life Forms
    【POJ 1226】Substrings
  • 原文地址:https://www.cnblogs.com/wuba/p/11025477.html
Copyright © 2011-2022 走看看