//编程列出一个字符串的全部字符组合情况。原始字符串中没有重复字符。
//例如:
//原始字符串是“abc”,打印得到下列所有组合情况:
//“a” “b” “c”
//"ab" "ac" "ba" "bc" "ca" "cb"
//"abc" "acb" "bac" "bca" "cab" "cba"
package test;
import java.util.TreeSet;
public class Test19 {
/**
* @param args
*/
/* 思路:(个人思路,其实做法蛮多(主要指第三步),但我懒得去实验了,做出来就行啦 哇咔咔)
* 1.获取字符串中字符元素(通过char数组)
* 2.遍历字符串中单个字符(遍历char数组 就好啦)
* 3.通过for循环 遍历 两个字符的组合情况 到 字符串string.length()个字符的组合情况 (
* 如遍历count个字符的组合情况:
* (1)获取count个字符的组合情况 的 个数x
* (2)用char[] 中字符 组合出 x个 不重复的 count个字符的字符串 (通过random随机组合放入TreeSet中:运用TreeSet的特点 不重复 还能 有序输出 )
* )
*/
public static void main(String[] args) {
// 1.获取字符串中字符元素(通过char数组)
String s = "abc";
char[] ch = s.toCharArray();
// 2.遍历字符串中单个字符(遍历char数组 就好啦)
for (char c : ch) {
System.out.println(c);
}
// 3.通过for循环 遍历 两个字符的组合情况 到 字符串string.length()个字符的组合情况
for (int count = 2; count <= ch.length; count++) {
// 用char[] 中字符 组合出 x个 不重复的 count个字符的字符串
TreeSet<String> set = new TreeSet<>();
while(set.size() < getNum(count,ch.length)){
StringBuffer sb = new StringBuffer();
for (int i = 0; i < count;) {
String s1 = ((Character)(ch[(int) (Math.random() * ch.length)])).toString();
if(!sb.toString().contains(s1)) {
sb.append(s1);
i++;
}
}
set.add(sb.toString());
}
System.out.println(set);
}
}
// 获取count个字符的组合情况 的 个数x(例如:获取3个元素中 2个元素 有序排列组合的个数 x=3*2=6
// 获取4个元素中3个元素有序排列组合的个数 x=4*3*2=24)
private static int getNum(int count, int length) {
int x = 1;
for (int i = length - count + 1; i <= length; i++) {
x = x * i;
}
return x;
}
}
欢迎大家给出更好更简便的做法哦 (感觉我在这用random cpu的内心一定是崩溃的)
|
|