本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目 

  输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。(本文代码采用ArrayList<String>接收返回的字符串,并要求不出现重复字符串)

思路

  将字符串看成两部分,一部分是第一个字符,另一部分是后面的所有字符。

  首先确定第一个字符,该字符可以是字符串中的任意一个;固定第一个字符后,求出后面所有字符的排列(相同步骤,采用递归)。

  实现第一个字符的改变,只需要将第一个字符和后面所有字符进行交换即可(最早自己想的是从原始字符串拿出第i个字符,然后合并剩下的字符到后面,其实就是个交换的过程,自己开始时想得太复杂了)。要记得字符串输出后要将字符交换回来,变回原始的字符串。

测试算例 

  1.功能测试(有多个重复字母的字符串、所有字符相同的字符串、一个字符或者多个字符的普通字符串)

  2.特殊测试(字符串为null、“”)

Java代码

//题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,
//则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 public class StringPermutation { public ArrayList<String> Permutation(String str) {
ArrayList<String> list = new ArrayList<String>();
if(str==null || str.length()==0)
return list;
permutationCore(str.toCharArray(),0,list);
Collections.sort(list); //将list中的字符串排序
return list;
} private void permutationCore(char[] strArray,int index,ArrayList<String> list){
if(index==strArray.length-1){
if(!list.contains(String.valueOf(strArray))) //判断是否有重复字符串
list.add(String.valueOf(strArray));
}else{
for(int i=index;i<strArray.length;i++){
char temp=strArray[index];
strArray[index]=strArray[i];
strArray[i]=temp;
permutationCore(strArray,index+1,list);
strArray[i]=strArray[index];
strArray[index]=temp;
}
}
}
}

  

收获

  1.要对字符串进行修改,可以将字符串转化为字符数组进行修改,也可以考虑使用StringBuilder类。

  2.list.contains()方法可以直接判断是否有重复字符串;Collections.sort(list)可以将list中的字符串进行排序。

  3.字符串和字符数组间的转化:str.toCharArray()     String.valueOf(strArray)

  4.数组在递归过程中进行了交换后,最终要记得交换回来(代码最后几行)

更多:《剑指Offer》Java实现合集  

  

最新文章

  1. DevExpress--navBarControl控件
  2. 分享:PHP获取MAC地址的实现代码
  3. Rebound-Android的弹簧动画库
  4. 阿里云 centos vim 显示中文 乱码
  5. HDU2037 贪心 动归均可+证明
  6. 关于C语言
  7. AM335X的USB otg网卡(RNDIS /Ethernet Gadget)调试
  8. Beta集合
  9. MongoDB系列六(聚合).
  10. Python多线程实例
  11. A1106. Lowest Price in Supply Chain
  12. Integer.parseInt vs Integer.valueOf
  13. Struts局部异常与全局异常处理
  14. linux网络常用命令
  15. Mina 系列(四)之KeepAliveFilter -- 心跳检测
  16. 2018.09.26洛谷P1084 疫情控制(二分+倍增)
  17. java表格 JTable实例 (带滚动条,内嵌选择框)
  18. 第k小分数(二分值)
  19. [应用篇]第四篇 JSTL之C标签介绍
  20. hibernate自连接--典型的oracle自带emp实现

热门文章

  1. JavaScript之Dom1|DOM2|DOM3之DOM1【节点层次】
  2. 字符加密 Valentino 函数 (伪分治)
  3. pygame将文字保存为图片形式
  4. undefined reference问题总结
  5. mysql案例-sysbench安装测试
  6. Androidstudio中jar包重复或jar包里的类重复问题
  7. 代码控制打电话、发短信、发邮件、打开手机app等操作
  8. 20165230田坤烨《网络对抗》Exp1 PC平台逆向破解
  9. cartographer 安装问题
  10. Jetson tk1 刷机后要做的几件事