TopCoder SRM 405 Level 2 1000
一个理想的字符串,其中每个字母第一次出现的位置N,与这个字母在字符串中出现的次数M是相等的,求给定长度的字符串中最小的一个理想字符串
字符串长度小于100
相当于去搜索1~100中的一组不同的数
加起来等于长度L
同时每个数字都要小于等于比自己小的所有数的和加一
因为L比较小
所以用深搜就可以了
在这个过程中要注意深搜时候需要从大往小搜
这样才能满足“最小的”结果
搜索完之后的字符串构建的步骤因为StringBuffer用的不熟练
反而调试了很久
一个理想的字符串,其中每个字母第一次出现的位置N,与这个字母在字符串中出现的次数M是相等的,求给定长度的字符串中最小的一个理想字符串
字符串长度小于100
相当于去搜索1~100中的一组不同的数
加起来等于长度L
同时每个数字都要小于等于比自己小的所有数的和加一
因为L比较小
所以用深搜就可以了
在这个过程中要注意深搜时候需要从大往小搜
这样才能满足“最小的”结果
搜索完之后的字符串构建的步骤因为StringBuffer用的不熟练
反而调试了很久
1
import
java.util.
*
;
2 import java.util.regex. * ;
3 import java.text. * ;
4 import java.math. * ;
5 import java.awt.geom. * ;
6
7 public class IdealString
8 {
9 int [] table = new int [ 26 ];
10 int finalindex = 0 ;
11 int L;
12
13 public String construct( int length)
14 {
15 Arrays.fill(table, 0 );
16 L = length;
17 if (dfs( 1 , 0 , 0 )){
18 StringBuffer sb = new StringBuffer();
19 char c = ' A ' ;
20 int i , j = 0 ;
21 for (i = 0 ; i < L; ++ i)
22 sb.append( ' ' );
23 for (i = 0 ; i < finalindex; ++ i){
24 sb.setCharAt(table[i] - 1 , c ++ );
25 table[i] -- ;
26 }
27 for (i = 0 ; i < L; ++ i){
28 if (sb.charAt(i) != ' ' )
29 continue ;
30 while (table[j] == 0 ) j ++ ;
31 sb.setCharAt(i, ( char )( ' A ' + j));
32 table[j] -- ;
33 }
34 return sb.toString();
35 }
36 return new String();
37 }
38
39 boolean dfs( int num, int index, int sum){
40 table[index] = num;
41 int base = num + sum;
42 if (base == L){
43 table[index] = num;
44 finalindex = index + 1 ;
45 return true ;
46 }
47 if (base > L)
48 return false ;
49 int total = 0 ;
50 for ( int i = 0 ; i <= index ; ++ i)
51 total += table[i];
52 for ( int i = total + 1 ; i >= num + 1 ; -- i){
53 if (base + i <= L && dfs(i, index + 1 , base))
54 return true ;
55 }
56 return false ;
57 }
58 }
2 import java.util.regex. * ;
3 import java.text. * ;
4 import java.math. * ;
5 import java.awt.geom. * ;
6
7 public class IdealString
8 {
9 int [] table = new int [ 26 ];
10 int finalindex = 0 ;
11 int L;
12
13 public String construct( int length)
14 {
15 Arrays.fill(table, 0 );
16 L = length;
17 if (dfs( 1 , 0 , 0 )){
18 StringBuffer sb = new StringBuffer();
19 char c = ' A ' ;
20 int i , j = 0 ;
21 for (i = 0 ; i < L; ++ i)
22 sb.append( ' ' );
23 for (i = 0 ; i < finalindex; ++ i){
24 sb.setCharAt(table[i] - 1 , c ++ );
25 table[i] -- ;
26 }
27 for (i = 0 ; i < L; ++ i){
28 if (sb.charAt(i) != ' ' )
29 continue ;
30 while (table[j] == 0 ) j ++ ;
31 sb.setCharAt(i, ( char )( ' A ' + j));
32 table[j] -- ;
33 }
34 return sb.toString();
35 }
36 return new String();
37 }
38
39 boolean dfs( int num, int index, int sum){
40 table[index] = num;
41 int base = num + sum;
42 if (base == L){
43 table[index] = num;
44 finalindex = index + 1 ;
45 return true ;
46 }
47 if (base > L)
48 return false ;
49 int total = 0 ;
50 for ( int i = 0 ; i <= index ; ++ i)
51 total += table[i];
52 for ( int i = total + 1 ; i >= num + 1 ; -- i){
53 if (base + i <= L && dfs(i, index + 1 , base))
54 return true ;
55 }
56 return false ;
57 }
58 }