字符的组合
- 题目:
- 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 题目:
- 方法一:暴力遍历
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
String inStr = in.next();
ArrayList<String> result = new ArrayList<>();
// SubString返回 i , j - 1的字符
for(int i = 0; i < inStr.length(); i++) {
for(int j = i + 1; j <= inStr.length(); j++) {
String temp = inStr.substring(i, j);
if(!result.contains(temp)) {
result.add(temp);
}
}
}
Collections.sort(result, (a, b) -> a.length() != b.length() ? a.length() - b.length() : a.compareTo(b));
for(String val : result) {
System.out.println(val);
}
}
}
- 方法二:递归求解
@Test
public void test() {
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
String inStr = in.next();
ArrayList<String> result = new ArrayList<>();
Method(result, new StringBuilder(), 0, inStr);
Collections.sort(result, (a, b) -> a.length() != b.length() ? a.length() - b.length() : a.compareTo(b));
for(String val : result) {
System.out.println(val);
}
}
}
public void Method(ArrayList<String> result, StringBuilder sb, int start, String str) {
// 集合中包含重复值,递归结束
if(result.contains(sb.toString())) {
return ;
}
// 一个字符, 直接入集合reuslt
if(sb.length() == 1) {
result.add(sb.toString());
} else if(sb.length() > 1 && str.contains(sb.toString())) {
//
result.add(sb.toString());
}
for(int i = start; i < str.length(); i++) {
sb.append(str.charAt(i));
Method(result, sb, i + 1, str);
sb.deleteCharAt(sb.length() - 1);
}
}