曾经把我虐哭的题,,,:'(:'(
- /*
- 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
- 例如:
- 原始字符串是"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){
- List<String> list=combinations("abc",true);
- System.out.println(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 List<String> combinations(String str,int num) {
- List<String> list=new ArrayList<String>();
- char[] ch=str.toCharArray();
- if(num>ch.length)
- num=ch.length;
- for(int i=0;i<num;i++){
- list=getList(list, ch);
- }
- return list;
- }
- public static List<String> combinations(String str) {
- return combinations(str,str.length());
- }
- public static List<String> combinations(String str,boolean all) {
- List<String> result=new ArrayList<String>();
- List<String> temp=new ArrayList<String>();
- char[] ch=str.toCharArray();
- for(int i=0;i<ch.length;i++){
- temp=getList(temp, ch);
- result.addAll(temp);
- }
- return result;
- }
-
- public static List<String> getList(List<String> list, char[] ch) {
- if(list.size()==0){
- for(char c:ch)
- list.add(c+"");
- return list;
- }
- List<String> newList=new ArrayList<String>();
- for(String str:list)
- for(char c:ch)
- if(str.indexOf(c)==-1)
- newList.add(str+c);
- return newList;
- }
- }
复制代码 |