剑指Offer二十七: 字符串的排列

题干

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

思路

我们先用日常的思路来求解。有些像在高中时候做排序组合时候,对于给定的三个数求其不同的排列顺序,我们通常做的就是说,先固定一个数字,然后求取剩下的数字的排序组合,然后将其插入其中例如将bc排序有bc与cb然后将a插入其中的三个位置就会有六种想要的结果。还有一种思想就是说我们将第一个数字与后面不断进行交换,每次的交换以后将剩余的两个进行一个排列就变成了3个两次的排列。
这里我们思考如何实现第二种方法:先是aa进行交换,相当于a进行一个固定。然后bc(后两个)交换得到两种结果,然后ab交换之后,b进行一个固定,然后ac(后两个)进行交换。最后ac交换,c进行固定,ab(后两个交换位置)
这个时候我们可以先写出部分伪代码

for(int i=j;i<num.length;i++){
swap(num,i,j);
}
private void swap(int num[],int i,int j){
}

然后就是对于后面部分的交换而言,我们就可以利用值的变化与递归来解决。代码如下

import java.util.ArrayList;
import java.util.*;
public class Solution {
     public ArrayList<String> Permutation(String str) {
       ArrayList<String> array=new ArrayList<String>();
    
        all(str.toCharArray(),0,array);
          Collections.sort(array);   
        return array;
        
    }
    private void all(char [] ch,int i,ArrayList<String> array)
    {
        if(i==ch.length-1){
            String val=String.valueOf(ch);
            if(!array.contains(val))
                array.add(val);
        }
        else{
            for(int j=i;j<ch.length;j++){
            swap(ch,i,j);
            all(ch,i+1,array);
            swap(ch,i,j);
        }
        }
        
    }
    private void swap(char [] ch,int i,int j){
        char temp=ch[i];
        ch[i]=ch[j];
        ch[j]=temp;
    }
}
	```
发布了47 篇原创文章 · 获赞 28 · 访问量 2703

猜你喜欢

转载自blog.csdn.net/weixin_44015043/article/details/105370824