全排列

字符串的排列

http://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7

全排列,用递归回溯来完成。
我这里的思路是把所有的字符分成两部分,一部分是已经排列的,另一部分是还未排列的。
每一次for循环都会遍历还未排列的字符,把它加入到已经排列的那一部分,然后再进入下一层递归,递归返回要恢复原样。

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Arrays;

public class Solution {
    ArrayList<String> ans = new ArrayList<>();

    void dfs(StringBuilder sb, LinkedList<Character> list){
        int l = list.size();
        if(l==0){
            String result = sb.toString();
            if(!ans.contains(result)){
                ans.add(result);
            }
            return;
        }
        for(int i=0;i<l;i++){
            Character c = list.get(i);
            sb.append(c);
            list.remove(i);
            dfs(sb, list);
            list.add(i, c);
            sb.deleteCharAt(sb.length()-1);
        }
    }

    public ArrayList<String> Permutation(String str) {
        int l = str.length();
        if(l==0){
            return ans;
        }
        char[] cArr = new char[l];
        for(int i=0;i<l;i++){
            cArr[i] = str.charAt(i);
        }
        // 确保有序,得先排序
        Arrays.sort(cArr);
        // 链表适合中间删除插入元素。
        LinkedList<Character> list = new LinkedList<>();
        for(int i=0;i<cArr.length;i++){
            list.add(cArr[i]);
        }
        // StringBuilder 适合字符串的频繁更改
        StringBuilder sb = new StringBuilder();
        dfs(sb, list);
        return ans;
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
彧未sr:查看图片
投递牧原集团等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务