字符串的排列

题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 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 }

 

posted on 2020-09-11 16:18  _那些你很冒险的梦  阅读(226)  评论(0)    收藏  举报

导航