《剑指 offer》 学习27之字符串的排列

    技术2024-06-29  73

    题目描述

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

    输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 题目链接:牛客网

    解题思路

    import java.util.*; public class Main { public static ArrayList<String> list = new ArrayList(); public static void main(String[] args) { String s = "abc"; printList(permutation(s)); } public static ArrayList<String> permutation(String str) { if (str.length() == 0) { return list; } char[] ch = str.toCharArray(); Arrays.sort(ch); backtracking(ch,new boolean[ch.length],new StringBuilder()); return list; } public static void backtracking(char[] chars,boolean[] hasUesd,StringBuilder sb) { if (sb.length() == chars.length) { list.add(sb.toString()); return; } for (int i = 0;i < chars.length;i++) { if (hasUesd[i]) { continue; } if (i != 0 && chars[i] == chars[i - 1] && !hasUesd[i - 1]) { // 保证不重复 continue; } hasUesd[i] = true; sb.append(chars[i]); backtracking(chars,hasUesd,sb); sb.deleteCharAt(sb.length() - 1); hasUesd[i] = false; } } public static void printList(ArrayList list) { for (int i = 0;i < list.size();i++) { System.out.print(list.get(i) + " "); } } }

    测试结果

    Processed: 0.014, SQL: 9