剑指Offer——字符串的排列
2018-03-07 21:25
387 查看
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。import java.util.ArrayList;
import java.util.*;
public class Solution {
//思路:一个字符串的排列可以分为两个部分来看,第一个部分是第一个字母选择随机某一个字符
//然后剩下的字符再选择剩下的字符作为第一个字符,显然这是一个递归的过程,那么我们分别把
//第一个字符和后面的字符一次交换顺序,就可以得到以不同字符开头的排列,但是这里注意,因
//为存在重复的字符,因此当第一个字符和后面的字符重复的时候,不交换字符
public ArrayList<String> Permutation(String str) {
ArrayList<String> aList = new ArrayList<>();
if(str == null){
return aList;
}
PermutationCore(str.toCharArray(),0,aList);
Collections.sort(aList);
return aList;
}
public void PermutationCore(char[] chars,int begin, ArrayList<String> al){
//char[] chars = str.toCharArray();
if(begin == (chars.length-1)){
String s = String.valueOf(chars);
if(!al.contains(s))
al.add(s);
}
else{
for(int i = begin; i<chars.length; i++){
char temp0 = chars[i];
chars[i] = chars[begin];
chars[begin] = temp0;
PermutationCore(chars,begin+1,al);
char temp1 = chars[i];
chars[i] = chars[begin];
chars[begin] = temp1;
}
}
}
}
相关文章推荐
- 【剑指offer】字符串的排列
- 剑指Offer28字符串的排列(递归和非递归实现)扩展有重复元素的排列,字符串的组合种类
- (C++)剑指offer-27:字符串的排列(分解让复杂问题简单)(没太懂)
- 剑指offer——字符串的排列(好题,扩展题也很好,全排列的算法)
- 剑指offer:字符串的排列
- 剑指OFFER之字符串的排列(九度OJ1369)
- 【剑指Offer学习】【面试题28 :字符串的排列】
- 剑指Offer——面试题28:字符串的排列
- 剑指offer:字符串的排列(字符串全排列)
- 【剑指offer】二十、字符串的排列
- 剑指Offer------字符串的排列(全排列)
- 剑指offer 面试题28:字符串的排列
- 剑指offer - 面试题28:字符串的排列(递归+去重)
- 剑指offer(24)-字符串的排列
- 【剑指offer】题28:字符串的排列
- 剑指offer-面试题28-字符串的排列
- [剑指offer]字符串的排列
- 剑指offer————面试题28(字符串排列)
- 【剑指offer】字符串的排列
- 【剑指offer】面试题38:字符串的排列