算法题-字符串全排列
遇到一个这样的问题,记录一下:
问题:输入一串字符,输出这串字符的所有排列组合
思路:

解释一下:首先需要想到使用递归的思想,我开始想的是用树,进行遍历(前序、中序、后序),指定是不行的,又想到深度优先、广度优先,也不是,后来想到用递归,但是我开始的想法是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 }
有别的更优解决方案,望评论
浙公网安备 33010602011771号