算法系统学习-经典基础算法-全排列算法

算法原理参考此处

http://www.cnblogs.com/nokiaguy/archive/2008/05/11/1191914.html

或者结合剑指offer中字符串全排的讲解


Eg1:

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.util.ArrayList;
public class Solution {
     public ArrayList<String> Permutation(String str)
     {
         ArrayList<String> result= new ArrayList<String>();
 
         str=removerepeatedchar(str).trim();
         char [] s=str.toCharArray();
         arrange(s, 0 ,s.length,result);
         return result;
     }
     public void arrange( char [] s, int start, int len,ArrayList<String> result)
     {
        
         if (start==len- 1 )
         {
           result.add( new String(s)); 
         }
         else
         {
             for ( int i=start;i<len;i++)
             {
 
                swap(s,start,i);
                arrange(s,start+ 1 ,len,result);
                swap(s,start,i);
             }
         }
     }
     public void swap( char [] s, int i, int j)
     {
         char tmp = s[i];
         s[i]=s[j];
         s[j]=tmp;
         
     }
         public  String removerepeatedchar(String s) { 
         if (s ==  null
             return s; 
   
         StringBuffer sb =  new StringBuffer(); 
         int i =  0 , len = s.length(); 
         while (i < len) { 
             char c = s.charAt(i); 
             sb.append(c); 
             i++; 
             while (i < len && s.charAt(i) == c)
             {
                 i++; 
            
        
         return sb.toString(); 
     }
}
Eg2:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.util.ArrayList;
 
public class Solution {
     ArrayList<String> result= new ArrayList<String>();
     public String PrintMinNumber( int [] numbers) {
         if (numbers.length== 0 )
         {
          return "" ;  
         }
         
             
             String [] str= new String[numbers.length];
         
             for ( int i= 0 ;i<numbers.length;i++)
             {
                 Integer x=  new Integer(numbers[i]);
                 str[i]=x.toString();
             }
         
             arrange(str, 0 ,str.length);
 
            Long min=Long.MAX_VALUE;
              for ( int i= 0 ;i<result.size();i++)
            {
                Long x = Long.parseLong(result.get(i));
               if (x<min)
               {
                 min=x;
               }
 
            }
         return min+ "" ;
 
     }
     
     
         public void arrange(String [] str, int start, int len)
     {
         if (start==len- 1 )
         {
             StringBuffer sb= new StringBuffer();
             for ( int i= 0 ;i<len;i++ )
             {
                 //System.out.print(str[i]);
                     sb.append(str[i]);
             }
             String s=sb.toString();
             result.add(s);
         }
         else
         {
             for ( int i=start;i<len;i++ )
             {
                 swap(str,start,i);
                 arrange(str,start+ 1 ,len);
                 swap(str,start,i);
             }
         }
     }
      public  void swap(String []str, int i, int j)
     {
         String tmp = new String();
         tmp=str[i];
         str[i]=str[j];
         str[j]=tmp;
     }
     
     
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值