题目:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
有可能有大写字母和重复的字符
首先来看我自己写的程序
我自己写的不如别人的简洁而且省资源,但是容易理解,就两个关键步骤,一个是全排列,第二个就是查重和排序
我想你刚开始看到这个题也是这种想法,但是怎么实现呢?
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/**
* @author 作者
* @data 2019年8月22日
* 字符串排列
*/
public class Mian3 {
//放进set里进行查重
Set<String > set = new HashSet<String>();
public ArrayList<String> Permutation(String str) {
ArrayList<Character> list = new ArrayList<Character>();
ArrayList<String> list1=new ArrayList<String>();
if(str!=null&&str.length()>0) {
char [] ch = str.toCharArray();
for(int i =0;i<ch.length;i++) {
list.add(ch[i]);
}
PermutationHelper(-1, "", list);
for(String s:set) { //把set集合里去重的添加进list里进行准备排序
list1.add(s);
}
Collections.sort(list1); //排序,Collections对于字符串的排序已经有按字典排序的方式了
}
return list1;
}
//下面是全排列的过程
public int PermutationHelper(int index,String buffer,ArrayList<Character> list){
if(index!=-1&&list.size()>0) { //这个是删除在buffer末尾的字符,list中不应该继续存放着
list.remove(index);
}
if(list.size()<1) {
set.add(buffer);
return null;
}
for(int i =0;i<list.size();i++) { //这是删除已经在buffer里的字符,当然重复的还在list里,当
char ch1=list.get(i);
PermutationHelper(i, buffer+String.valueOf(ch1), list);
list.add(i,ch1); //因为集合是对象,用的引用,就必须加回来,给下一个遍历
}
return null;
}
//测试
public static void main(String[] args) {
ArrayList<String> list1=new Mian3().Permutation("abc");
for(int i =0;i<list1.size();i++) {
System.out.println(list1.get(i));
}
}
}
别人的做法
有很多,有递归的,有回溯的等等,看一下回溯吧
下面的来自https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7?f=discussion
链接:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7?f=discussion
来源:牛客网
import java.util.List;
import java.util.Collections;
import java.util.ArrayList;
public class Solution {
public static void main(String[] args) {
Solution p = new Solution();
System.out.println(p.Permutation("abc").toString());
}
public ArrayList<String> Permutation(String str) {
List<String> res = new ArrayList<>();
if (str != null && str.length() > 0) {
PermutationHelper(str.toCharArray(), 0, res);
Collections.sort(res);
}
return (ArrayList)res;
}
public void PermutationHelper(char[] cs, int i, List<String> list) {
if (i == cs.length - 1) {
String val = String.valueOf(cs);
if (!list.contains(val))
list.add(val);
} else {
for (int j = i; j < cs.length; j++) {
swap(cs, i, j);
PermutationHelper(cs, i+1, list);
swap(cs, i, j);
}
}
}
public void swap(char[] cs, int i, int j) {
char temp = cs[i];
cs[i] = cs[j];
cs[j] = temp;
}
}