排列组合(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;
}
}
联想公司福利 1496人发布