拼多多:最長1串的種類數
阿新 • • 發佈:2017-09-13
長子 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串的種類數