题解 | #字符串的排列#
字符串的排列
http://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7
描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
参考的是一叶浮jian的题解 ,进行了一些修改
思路上主要是采用递归的方式实现动态规划
需要注意的是题干上要求按照字典顺序打印出,我采用了Collections.sort()实现。
字段顺序的部分可以最后return前再进行处理,之前需要把字符串的所有排序可能输出出来,具体思路如下:
比如输入字符串"abc",则fun(abc)=
- a+fun(bc)
- b+fun(ac)
- c+fun(ab)
同理,以fun(bc)为例
fun(bc)= - b+fun(c)
- c+fun(b)
其中fun(c)=c, fun(b)
如果输入的字符串有相同的字符,如"aab",则从中拿出字符时,相同的字符只能拿出一次:
fun(aab)=
- a+fun(ab)
- b+fun(aa)
最终代码如下:
import java.util.ArrayList; import java.util.Collections; public class Solution { public ArrayList<String> Permutation(String str) { // 题目要求按字典顺序输出,所以这里需要排序 ArrayList<String> result = recursionPermutation(str); Collections.sort(result); return result; } public ArrayList<String> recursionPermutation(String str){ ArrayList<String> result = new ArrayList<String>(); if(str.length() == 1){ result.add(str); return result; } // 开始进行递归 for(int i = 0; i < str.length(); i++){ //进行复制,不更改原输入 StringBuilder strBuilder = new StringBuilder(str); ArrayList<String> subResult; if(i ==0 || strBuilder.charAt(0) != strBuilder.charAt(i)){ // 交换索引0与i处的字符 char temp = strBuilder.charAt(i); strBuilder.setCharAt(i, strBuilder.charAt(0)); strBuilder.setCharAt(0, temp); subResult = recursionPermutation(strBuilder.substring(1)); //对下层递归结果进行处理 for(int j = 0; j < subResult.size(); j++){ result.add(temp + subResult.get(j)); } } } return result; } }
String和StringBuilder的常见用法
//String的用法: //java中String是只读的,没有办法进行变换,因此需要使用StringBuilder。 String.length() //获取字符串的长度 String.charAt(i) //获取第i个字符的内容 String.subString(start) //获取[start,)的字符串 String.subString(start,end) //获取[start,end)中的字符串 char[] c = iniString.toCharArray() //将字符串转为char数组来进行改变字符内容 String.equal() //判断两个字符串是否相等 //StringBuilder的用法: 除了String中支持的方法外,StringBuilder支持字符的增、删、改。 stringBuilder.append("we"); //添加we在词尾 stringBuilder.insert(0,"we");//在0的位置加入后面的内容 stringBuilder.delete(0,1); //删除[0,1)的数据 stringBuilder.deleteCharAt(0); stringBuilder.setCharAt(0,'p'); //在某一个独特位置设置字符 char c = stringBuilder.charAt(i);//查询某个位置上的字符 System.out.println(stringBuilder); new String(stringBuilder);//用stringBuilder来初始化String