剑指Offer--字符串的排列

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

输入描述:

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

思路:
典型的DFS+回溯问题。
其中的坑在于如何去重。下面的代码采用的是Set集合去重。如果需要交换的两个位置的字符相等,那么就没有必要交换。

import java.util.*;
public class Solution {
    public ArrayList<String> Permutation(String str) {
        ArrayList<String> res = new ArrayList<>();
        if (str == null || str.length() == 0) {
            return res;
        }
        char[] chs = str.toCharArray();
        helper(res,chs,0);
        Collections.sort(res);
        return (ArrayList)res;
    }
    
    public void helper(ArrayList<String> res, char[] chs, int i){
        if(i == chs.length){
            res.add( new String(chs));
            return;
        }
        HashSet<Character> set = new HashSet<>();
        for(int j=i; j<chs.length;j++){
            if(! set.contains(chs[j])){
                set.add(chs[j]);
                swap(chs,i,j);
                helper(res,chs,i+1);
                swap(chs,i,j);
            }
        }
        return;
    }
    
    public void swap(char[] chs, int i, int j) {
        char temp = chs[i];
        chs[i] = chs[j];
        chs[j] = temp;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在前面: 最近遇到了一道题涉及全排列的。记得之前在《剑指offer》上遇到了一道类似的题。因此今早把这道题翻了出...
    BlueSkyBlue阅读 3,805评论 0 0
  • 本文首发于我的个人博客:尾尾部落 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串...
    繁著阅读 3,372评论 1 2
  • 题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排...
    qming_c阅读 3,262评论 0 0
  • 字符串的全排列 题目描述: 输入一个字符串,打印出该字符串中字符的所有排列。 例如输入字符串abc,则输出由字符a...
    MinoyJet阅读 13,860评论 4 11
  • 本系列导航:剑指offer(第二版)java实现导航帖](http://www.jianshu.com/p/010...
    ryderchan阅读 5,519评论 0 1