黑马程序员技术交流社区

标题: 算法题, 请问如何实现字符串的全排列? [打印本页]

作者: 张耀扬    时间: 2014-4-3 21:51
标题: 算法题, 请问如何实现字符串的全排列?
输入字符串.无重复字符.如何设计算法实现其全排列? 如输入abc. 要求输出 abc acb cba cab bac bca  


作者: 血剑无痕    时间: 2014-4-3 23:00
这种问题其实想想就会了不过这中算法要好好看下
@Test
  public void test() throws Exception
  {

    String str ="abc";
    String ch1 ="";
    String ch2="";
    String ch3="";
   for(int i=0;i<3;i++)  
   {    char[] ch={'a','b','c'};
       ch1=ch[i]+"";
       for(int n=0;n<3;n++)
       {
           ch2=ch[n]+"";
               for(int m=0;m<3;m++)
               {
                   ch3=ch[m]+"";   
                    System.out.println(ch1+ch2+ch3);
               }
       }
   }
  }

作者: 911趣购    时间: 2014-4-4 01:48
  1. package com.itheima;

  2. import java.io.*;


  3. public class Test7 {
  4.         public static void main(String[] args)throws IOException {
  5.                 String s="abc";//定义一个字符串
  6.             for(int i=0;i<s.length();i++)//循环字符串的长度
  7.             {
  8.                     String str=s.substring(i,i+1);//将字符串分割                    
  9.                     System.out.print('"'+str+'"'+"  ");//打印分割后的字符串
  10.             }
  11.             System.out.println();//单字符完成后打印换行
  12.             for(int i=0;i<s.length();i++)//二次循环字符串的长度
  13.             {
  14.                     String s1=s.substring(i,i+1);//将二次循环后的字符串分割
  15.                     for(int j=0;j<s.length();j++)//再次循环分割后的字符串
  16.                     {
  17.                             String s2=s.substring(j,j+1);//再分割
  18.                             String s3;//定义个字符接收
  19.                             if(s1.equals(s2))//如果循环前的和分割后的相等,就继续
  20.                             {
  21.                                     continue;
  22.                             }else{//否则就组合
  23.                                     s3=s1+s2;
  24.                             }
  25.                             System.out.print('"'+s3+'"'+"  ");//打印组合后的情况
  26.                     }
  27.             }
  28.             System.out.println();//二次循环后打印换行
  29.             for(int i=0;i<s.length();i++)//三次循环字符串的长度
  30.             {
  31.                     String s1=s.substring(i,i+1);//三次分割字符串
  32.                     for(int j=0;j<s.length();j++)
  33.                     {
  34.                             String s2=s.substring(j,j+1);;
  35.                             String s3;
  36.                             if(s1.equals(s2))
  37.                             {
  38.                                     continue;
  39.                             }else{
  40.                                     s3=s1+s2;
  41.                             }
  42.                             for(int k=0;k<s.length();k++)
  43.                             {
  44.                                     String s4=s.substring(k,k+1);
  45.                                     String s5;
  46.                                     if(s2.equals(s4)||s1.equals(s4))//如果两次循环后的都相等,就继续,否则就再次进行组合
  47.                                     {
  48.                                             continue;
  49.                                     }else{
  50.                                             s5=s4+s3;
  51.                                     }
  52.                               System.out.print('"'+s5+'"'+"  ");
  53.                             }
  54.                            
  55.                     }
  56.             }
  57.         }

  58. }
复制代码
看懂这个   你那个就会了。。。。。


作者: chen_x    时间: 2014-4-4 15:37
自己写的用递归实现无重复字符串全排列的方法,希望有用,可以共同讨论下~


  1. /*
  2. 思路:基本就是按照数学中排列组合的原理,对多个字符排列时,第一个位置上可以选取全部字符,
  3. 第二个位置上可取除去第一个位置上字符的剩余所有字符,依次类推。。。
  4. */
  5. import java.lang.*;
  6. import java.util.*;
  7. class Test8{
  8.     public static void main(String[] args){
  9.         String str="abc";
  10.         System.out.println((all(str)).size());
  11.         System.out.println(all(str));
  12.     }
  13.     public static ArrayList all(String str){
  14.         ArrayList<String> al=new ArrayList<String>();
  15.         if(str.length()==1){
  16.             al.add(str);
  17.             return al;            
  18.         }else{
  19.             char[] ch=str.toCharArray();
  20.             for(int i=0;i<ch.length;i++){//对排列第1个位置上的可取字符进行遍历
  21.                 String sub=str.replace(ch[i]+"","");
  22.                 ArrayList arr=all(sub); //递归对除去第1个位置上字符的剩余子串进行排列
  23.                 Iterator<String> it=arr.iterator();
  24.                 while(it.hasNext()){
  25.                     String s=new String();
  26.                     //String ss=it.next();
  27.                     String re=it.next()+ch[i];//合起来就是整个字符串了
  28.                     al.add(re);
  29.                 }
  30.             }
  31.             return al;            
  32.         }        
  33.     }
  34. }
复制代码


运行结果是
  1. 6
  2. [cba, bca, cab, acb, bac, abc]
复制代码

ps: 主函数中是直接打印的返回的ArraryList对象,还可修改下打印的更好看点;这个代码应该是对任意长度的字符串都是适用的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2