1. 程式人生 > >拼多多:最長1串的種類數

拼多多:最長1串的種類數

長子 pla 其中 現在 char 第一個 package 位置 相加

題目:(根據回憶寫的,只描述了大概意思)

  現有一組0、1字符串,其字符數為m,可以將0更改為1的最大次數為n。在字符串中肯定存在在改動n次以內的最長的只由1組成的子串。最長子串可能會出現多次,現在求最長子串出現的次數。

  其中,如果1的位置不發生變化就認為是一次。例如:對3,2, “010”來講,先改第一個0後改第二個0的結果都是“111”,只算做最長子串出現一次。

例子:

樣例:5,2,"10101"

樣例結果:1

樣例代碼:

 1 package test4ljd;
 2 
 3 import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
4 5 public class test4ljd { 6 public static void main(String[] args){ 7 //System.out.println("------------"+ maxZi(7,1,"1010101")); 8 System.out.println("------------"+ maxZi(5,2,"10101")); 9 10 } 11 12 public static int maxZi(int m, int n, String s){
13 int countf = 0; 14 //代碼內容 15 16 return countf; 17 } 18 }

  這個問題看著就頭疼,感覺像是動態規劃,自己實在是不喜歡動態規劃的問題,所以就用枚舉的方式暴力解決了。

  解決的方式就是,因為我們不知道經過n次以內將0改為1的最長連續1子串為多大。所以

    我們就先假設其最長連續1子串為字符串的長度,然後比對得到需要將0修改幾次,如果修改次數在允許範圍之內那麽就說明此子串為最大子串,即種類數為1個;

    如果最長連續1子串的長度不是字符串長度,接著假設最長連續1子串為字符串長度減1,然後依次和長度為字符串長度減2的子串對比,得到需要修改0的次數,如果修改次數在允許範圍內,那麽就說明最大子串為此子串,種類個數需要在比對的過程中計數,如果最長子串不是此子串,那麽繼續;

    假設最長1子串的長度位字符串長度減2,然後依次比對,得到修改0的次數,.............

  很笨的解決方案,甚至在很長的時候,會浪費大部分的時間和空間在程序中,如果字符串長度很長的情況下。

倉促間寫的代碼如下:

 1 package test4ljd;
 2 
 3 import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
 4 
 5 public class test4ljd {
 6 
 7     public static void main(String[] args){
 8         
 9         //System.out.println("------------"+ maxZi(7,1,"1010101"));
10         System.out.println("------------"+ maxZi(5,2,"10101"));
11         
12     }
13     
14     public static int maxZi(int m, int n, String s){
15         int countf = 0;
16         
17         int[] a = new int[m];
18         for (int i = 0; i < a.length; i++) {
19             a[i]=Integer.valueOf(s.charAt(i)-48);
20             if (a[i]==1) {
21                 a[i] = -1;
22             }
23         }
24         
25         //尋找最大子串
26         for (int i = m; i > 0; i--) {
27             //設最大子串為b
28             int[] b = new int[i];
29             int[] f = new int[i];
30             for (int j = 0; j < b.length; j++) {
31                 b[j] = 1;
32             }
33             //遍歷看最小改變次數多少
34             countf = 0;
35             boolean countg = false;
36             int count = 0;
37             int l = m-i;
38             for(int j = 0; j <= l;j++){
39                 System.arraycopy(a, j, f, 0, i);
40                 //兩個數組對應位置相加,並求和
41                 count = 0;
42                 for (int k = 0; k < b.length; k++) {
43                     count += (b[k] + f[k]);
44                     if (count > n) {
45                         break;
46                     }
47                 }
48                 if (count <= n) {//尋找到最大子串
49                     countg = true;
50                     countf+=1;
51                 }
52             }
53             if (countg) {//尋找到最大子串,並保留countf,此時countf是方法數
54                 break;
55             }
56         }
57         
58         return countf;
59     }
60 }

拼多多:最長1串的種類數