算法题-字符串全排列

遇到一个这样的问题,记录一下:

问题:输入一串字符,输出这串字符的所有排列组合

思路:

解释一下:首先需要想到使用递归的思想,我开始想的是用树,进行遍历(前序、中序、后序),指定是不行的,又想到深度优先、广度优先,也不是,后来想到用递归,但是我开始的想法是100层台阶,每次上1-2-3级,一共需要多少步,显然不对,导致这道题没做出来。正解如下:

首先设定下标 i 和 j ,每次进行 i 和 j 两个元素之间的交换,然后初始 j 加 1 ,再次重复操作交换,自己本身交换也算。如上图 ‘⬇’ 表示 i ,‘⬆’表示 j  图片应该好理解。

代码如下:

 1 package com.example.demo.zih.controller;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.Scanner;
 6 
 7 /**
 8  * @Author yuanbb
 9  * @date 2022/5/25 19:27
10  */
11 public class Test {
12 
13     public static void main(String []args) {
14         Scanner sc = new Scanner(System.in);
15         String str = sc.next();
16         List<String> list = new ArrayList<>();
17         fun(str.toCharArray(), 0, list);
18         for(String ele : list) {
19             System.out.println(ele);
20         }
21     }
22 
23     private static void fun(char[] str, int j, List<String> list) {
24         if(j == str.length - 1 && !list.contains(str)) {
25             list.add(String.valueOf(str));
26             return;
27         }
28         for(int i=j; i<str.length; i++) {
29             swap(str,i,j);
30             fun(str,j+1,list);
31             swap(str,i,j);
32         }
33     }
34 
35     public static void swap(char[] str, int i, int j) {
36         char t = str[i];
37         str[i] = str[j];
38         str[j] = t;
39     }
40 
41 }

有别的更优解决方案,望评论

posted on 2022-05-26 21:55  南瓜小子  阅读(48)  评论(0)    收藏  举报

导航