字符串排序,可能有重复字母

it2022-05-08  11

参考大佬的博客

问题描述

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

问题分析

String.valueOf() 方法将不同类型打印成字符串。 Collection.sort() 将字符串排序的流程即从第1位开始和后面每位数进行交换然后递归到第二位进行同样操作。 如果字符串中含有相同的字符则需要注意! 去重的全排列就是从第一个数字起,每个数分别与它后面非重复出现的数字交换。这次同样要注意保持原有数据结构不变!具体由在递归后加一个swap,将替换的元素替换回来完成。 import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Set; public class Solution { public ArrayList<String> Permutation(String str) { ArrayList<String> arrayList=new ArrayList<>(); char[] chars=str.toCharArray(); Permutation(arrayList,0,chars); Collections.sort(arrayList); return arrayList; } private void Permutation(ArrayList<String> arrayList,int i,char[] chars){ if (i==chars.length-1) arrayList.add(String.valueOf(chars)); Set<Character> set=new HashSet<>(); for (int j=i;j<chars.length;j++){ if (i==j||!set.contains(chars[j])){ set.add(chars[j]); swap(chars,j,i); Permutation(arrayList,i+1,chars); swap(chars,j,i); } } } private void swap(char[] chars,int i,int j){ char temp=chars[i]; chars[i]=chars[j]; chars[j]=temp; } }

最新回复(0)