排列组合(1)-字符串的排列
字符串的排列
https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7?tpId=117&tqId=37778&rp=1&ru=%2Fta%2Fjob-code-high&qru=%2Fta%2Fjob-code-high%2Fquestion-ranking&tab=answerKey
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
示例1
输入
"ab"
返回值
["ab","ba"]
code
import java.util.*; public class Solution { public ArrayList<String> Permutation(String str) { ArrayList<String> res = new ArrayList<>(); char[] chs = str.toCharArray(); Arrays.sort(chs); res.add(str); while(true){ String a = nextString(chs); if(a.equals("finish"))break; res.add(a); } return res; } private String nextString(char[] chs){ int n = chs.length; int i = n-1,j = n-1; //找到升序,例如68,i指向8 while(i>0 && chs[i-1]>=chs[i]) i--; if(i==0)return "finish"; //找到i及i后面数中。比i-1元素大的数,例如7 while(j>0 && chs[j]<=chs[i-1]) j--; //交换i-1和j swap(chs,i-1,j); //将i及后面的元素序列翻转 for(int a=i,b=n-1;a<b;a++,b--){ swap(chs,a,b); } return new String(chs); } private void swap(char[] chs,int a,int b){ char temp = chs[a]; chs[a]=chs[b]; chs[b]=temp; } }