面试题目 - String 相关
输入一个字符串,打印输出该字符串中字符的所有排列。你可以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入: s = “abc”;
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
限制:1 <= s 的长度 < = 8
import java.util.Arrays;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个长度 8 以内的字符串:");
String str = sc.next();
if(str.length()>=1 && str.length()<=8) {
// String str = "abc";
//先将一个字符放到结果集中
String[] result= new String[1];
result[0]=str.substring(0, 1);
//遍历截取字符串 ,用之前的结果集,和下一个字符重新生成新的结果集
for (int i = 1; i < str.length(); i++) {
result=test(result,str.substring(i, i+1));
}
for (int i = 0; i < result.length; i++) {
System.out.println(result[i]);
}
System.out.println(result.length);
}else {
System.out.println("请输入一个长度1~8的字符串");
}
}
//将数组中的所有元素,和字符a拼接,生成新的结果
public static String[] test(String[] source,String a) {
//新结果集的最大长度为拼接后字符串的长度乘以之前结果集的长度
int lenght=source.length*(source[0].length()+1);
String[] result= new String[lenght];
//记录数据存放的角标
int s=0;
//遍历当前结果的每个元素
for (String string : source) {
//循环将字符a 插入到字符串的每个位置
for (int j = 0; j < string.length()+1; j++) {
String b=string.substring(0, j)+a+string.substring(j, string.length());
//因为字符串中的可以重复,可能会出现重复结果,所以先判断是否已包含此结果
if(!contains(result,b)) {
result[s]=b;
s++;
}
}
}
//因为之前创建的数组长度为可能的最大长度,所以在最后截取用到的长度的数组返回
String[] copyOf = Arrays.copyOf(result, s);
return copyOf;
}
// 判断是否已包含此结果
public static boolean contains(String[] result,String str) {
for (int i = 0; i < result.length; i++) {
if(str!=null&&result[i]!=null&&result[i].equals(str)) {
return true;
}
}
return false;
}
}