字符串的排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 abc,则按字典序打印出由字符 a,b,c 所能排列出来的所有字符串 abc,acb,bac,bca,cab 和 cba。
输入描述:输入一个字符串,长度不超过 9 (可能有字符重复),字符只包括大小写字母。
分析:首先读题我们发现,这种从固定的数组 / String 里的取出元素进行排列组合,是经典的 permutation 题目。然后我们发现,这题的要求是 需要我们返回所有不重复的排列组合,而不是返回有多少种排列组合,所以我们需要建一个 String 的 Arraylist 来存储所有排列出的不重复的字符串。
除此之外,我们新建一个辅助 method,用于不停的循环向下寻找所有可能的排列组合。
在这个辅助 method 里,有三个arguments。第一个是 str,即当前我们剩下可以取的 string,第二个是 cur,即我们当前所拥有的字符串,第三个是 result,是我们符合条件的字符串的合集。在这个辅助 method 中,我们首先需要检测,我们还有没有能取的 string,如果没有,我们便可以开始确认我们当前所拥有的字符串有没有被放进最后的 Arraylist result中,如果没有,我们便将他加进去。
接下来,当我们还有能取的 string 时,我们就可以开始进行循环。对于现在所剩下的 string 其中的每一个字符串,我们都将他尝试与我们现有的 string cur 进行组合,所以循环的 argument 的 cur 此时变成 cur+Str.charAt(i)。
然后因为我们已经把当前位于 i 的字符取过了,我们的第一个 argument 需要被更新为除这个的剩下的 string,我们这里运用了 substring 来取 i 之前的 string 和 i 之后的 string 进行相加。如此循环,直到我们所有的可能性都被取完。这个方法同样也适用于我们需要排列组合的时一个数组而非string的情况。
PS:与牛客相同!
1 import java.util.ArrayList; 2 3 public class Solution { 4 public ArrayList<String> Permutation(String str) { 5 ArrayList<String> result = new ArrayList<>(); 6 if(str.length() == 0){ 7 return result; 8 } 9 recur(str, "", result); 10 return result; 11 } 12 public void recur(String str,String cur,ArrayList<String> result){ 13 if(str.length() == 0){ 14 if(!result.contains(cur)){ 15 result.add(cur); 16 } 17 } 18 for(int i = 0; i < str.length();i++){ 19 recur(str.substring(0,i)+str.substring(i+1,str.length()),cur+str.charAt(i),result); 20 } 21 } 22 }