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许可协议。转载请注明出处!
  • 相关阅读:
    结对 总结
    ”耐撕“团队 2016.3.29 站立会议
    词频统计 List Array
    基本数据结构简述
    深入理解HashMap
    常用排序算法Java实现
    Spring核心组件知识梳理
    HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法
    Nginx是什么东东?
    Java中常用的四种线程池
  • 原文地址:https://www.cnblogs.com/wuba/p/11025477.html
Copyright © 2011-2022 走看看