小言_互联网的博客

剑指offerNo27. 字符串的排列(Java)

350人阅读  评论(0)

题目描述:

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

思路:

整体分为两步:

  • 求出出现在第一个位置上的字符,即把第一个字符与后面所有的字符进行交换。
  • 固定第一个字符,并求后面字符的排列。后面的部分我们同样可以看成两部分,....依次递归进行。

代码:


  
  1. package offer;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. public class TestNo27 {
  5. public static void main(String[] args) {
  6. String s = "abc";
  7. System.out.println( new TestNo27().Permutation(s));
  8. }
  9. public ArrayList<String> Permutation(String str) {
  10. ArrayList<String> res = new ArrayList<>();
  11. if(str == null || str.length() == 0){
  12. return res;
  13. }
  14. helper(res, 0,str.toCharArray()); //从第一个位置开始递归
  15. Collections.sort(res); //按字典序排序
  16. return res;
  17. }
  18. private void helper(ArrayList<String> list,int idx,char[] arr){
  19. if(idx == arr.length -1){
  20. //如果idx到了最后一个字符,说明找到了一个排列
  21. String s = String.valueOf(arr);
  22. if(! list.contains(s)){
  23. list.add(s); //如果这个排列不在答案列表中
  24. }
  25. } else{
  26. for( int i = idx;i<arr.length;i++){ //将第i个位置字符和后续所有字符进行交换
  27. swap(arr,idx,i); //交换第idx个位置和第i个位置的字符
  28. helper( list,idx+ 1,arr); //固定了第idx个位置,递归的寻找子序列的全排列
  29. swap(arr,idx,i); //交换回来 以便将第idx个位置字符和后续另一个字符进行交换
  30. }
  31. }
  32. }
  33. private void swap(char[] arr,int i,int j){
  34. char temp = arr[i];
  35. arr[i] = arr[j];
  36. arr[j] = temp;
  37. }
  38. }

 


转载:https://blog.csdn.net/qq_40664693/article/details/104413256
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场