字符串的排列(剑指offer)

Posted wuba

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串的排列(剑指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;
        
    
技术图片

以上是关于字符串的排列(剑指offer)的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer :字符串的排列

剑指offer 字符串的排列

剑指offer 字符串的排列

剑指Offer题目:字符串的排列

字符串的排列(剑指offer)

剑指 Offer 38. 字符串的排列