赞
踩
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
限制:
1 <= s 的长度 <= 8
排列方案数量: 对于一个长度为n的字符串(假设字符不重复),其排列共有 n × ( n − 1 ) × ( n − 2 ) . . . × 2 × 1 n \times (n-1) \times (n-2)...\times2\times1 n×(n−1)×(n−2)...×2×1种方案。
排列方案的生成方法: 根据字符串排列的特点,考虑深度优先搜索所有排列方案。即通过字符交换,先固定第1位字符(n种情况)、再固定第2位字符(n-1种情况)、…、最后固定第n位字符(1种情况)。
重复方案与剪枝: 当字符串存在重复字符时,排列方案也存在重复方案。为排除重复方案,需在固定某位字符时,保证“每种字符只在此位固定一次”,即遇到重复字符时不交换,直接跳过。从DFS角度看,此操作称为“剪枝”。
递归解析:
class Solution { LinkedList<String> res = new LinkedList<>(); char[] c; public String[] permutation(String s) { c = s.toCharArray(); dfs(0); return res.toArray(new String[res.size()]); } private void dfs(int x) { if (x == c.length - 1) { res.add(String.valueOf(c)); return; } HashSet<Character> set = new HashSet<>(); for (int i = x;i < c.length;i++) { if (set.contains(c[i])) continue; set.add(c[i]); swap(x,i); dfs(x + 1); swap(x,i); } } private void swap(int a, int b) { char tmp = c[a]; c[a] = c[b]; c[b] = tmp; } }
复杂度分析:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。