其实我还是用了集合
- /*
- 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
- 例如:
- 原始字符串是"abc",打印得到下列所有组合情况
- "a" "b" "c"
- "ab" "bc" "ca" "ba" "cb" "ac"
- "abc" "acb" "bac" "bca" "cab" "cba"*/
- import java.util.*;
- class PermComStr{
- public static void main(String[] args){
- String[] list=combinations("abcd",2);
- System.out.println(Arrays.toString(list));
-
- }
- /*思路分析:
- 每行字符个数都是递增 ,下一行的字符是建立在上一行的基础上得到的
- 即在将第一行字符串长度限定为1,第二行为2....,在第一行数据基础上{a,b,c},创建第二行数据,遍历字符串中所字符,并与第一行数据组合。注意每行字符串长度限制
- 1、先将原始字符串转换成字符数组ch
- 2、将原始字符串每个字符添加到Arraylist<String> list集合中
- 3、遍历list集合用每个元素str去查找是否存在数组ch中的元素,如果ch中的字符c没有被str找到则用str+c作为新集合的值返回;
- 4、遍历新集合重复3步骤
- */
- public static String[] getStringArr(String[] src, char[] ch) {
- String[] newStr=new String[16];
- int len=0;
- for(String str:src){
- for(char c:ch){
- if(str.indexOf(c)==-1)
- newStr[len++]=str+c;
- if(len==newStr.length){
- String[] temp=new String[newStr.length*2];
- System.arraycopy(newStr, 0, temp, 0, len);
- newStr=temp;
- }
- }
- }
- String[] temp=new String[len];
- System.arraycopy(newStr, 0, temp, 0, len);
- newStr=temp;
- return newStr;
- }
- public static String[] combinations(String str,int num) {
- char[] ch=str.toCharArray();
- if(num>ch.length)
- num=ch.length;
-
- String[] src=new String[ch.length];
- for(int i=0;i<ch.length;i++)
- src[i]=ch[i]+"";
-
- for(int i=1;i<num;i++){
- src=getStringArr(src, ch);
- }
- return src;
- }
- }
复制代码 |