题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路
这是典型的递归求解问题,递归算法有四个特性:
- 必须有可达到的终止条件,否则程序陷入死循环
- 子问题在规模上比原问题小
- 子问题可通过再次递归调用求解
- 子问题的解应能组合成整个问题的解
借用别人的图
核心代码:
for (int j = i; j < cs.length; j++) {
swap(cs, i, j);
PermutationHelper(cs, i+1, list);
swap(cs, i, j);
}
例如cs=abc ,仅阐述关键部分,list部分可以看PermutationHelper(cs, i+1, list)方法分析
1)swap(0,0),固定a,bc进行组合 ,形成abc,acb;再执行swap(0,0);
2)swap(0,1),则a与b交换位置,b固定,ac组合,形成bac,bca;再执行swap(0,1),还原为cs为abc;
3)swap(0,2),则a与c交换位置,c固定,组合ab,形成cab,cba;再执行swap(0,2),cs还原为abc;
完整代码:
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayL