題目詳情:給定乙個字串,僅由a,b,c 3種小寫字母組成。
當出現連續兩個不同的字母時,你可以用另外乙個字母替換它,如 有ab或ba連續出現,你把它們替換為字母c;
有ac或ca連續出現時,你可以把它們替換為字母b;
有bc或cb 連續出現時,你可以把它們替換為字母a。
你可以不斷反覆按照這個規則進行替換,你的目標是使得最終結果所得到的字串盡可能短, 求最終結果的最短長度。
輸入:字串。長度不超過200,僅由abc三種小寫字母組成。
輸出: 按照上述規則不斷消除替換,所得到的字串最短的長度。
例如:輸入cab,輸出2。因為我們可以把它變為bb或者變為cc。 輸入bcab,輸出1。儘管我們可以把它變為aab -> ac -> b,也可以把它變為bbb, 但因為前者長度更短,所以輸出1。
經過一番思考,我想出了乙個比較有效的演算法,現跟大家分享。
用 i,j,k分別記錄下a,b,c字母的個數,當有兩個字母的數目大於等於1,例如i=2,j=3,k=0,因為min(i,j)=2,所以可以i=i-2,j=j-2,k=k+2如此下去,直到只有乙個字母的個數大於等於1,輸出這個字母的個數即可。
經過網友提醒,我發現這樣的做法是有點問題的。需要考慮的特殊情況就是兩個數是相等的,減完後全加到另乙個數上了。
例如i=3,j=3,k=3.i==j,故i-3,j-3,k+3最後結果就是6了。
下面就要排除這個情況。
首先可以證明當i==j==k時,結果為2;
其次當i==j&&k==0時,結果為:若i為基數,則為1,偶數則為2.
其它情況就還是可以用一步到位的方法。
**我已經改了。
**如下:
int simplifystr(string str)
if (k>0&&j>0&&k!=j)
if (i>0&&k>0&&i!=k)
if (i>0&&j>0&&i!=j)
}if (i>0)return i;
if (j>0)return j;
if (k>0)return k;
}
給定乙個字串,僅由a,b,c 3種小寫字母組成。
package com.boco.study 題目詳情 給定乙個字串,僅由a,b,c 3種小寫字母組成。當出現連續兩個不同的字母時,你可以用另外乙個字母替換它,如 有ab或ba連續出現,你把它們替換為字母c 有ac或ca連續出現時,你可以把它們替換為字母b 有bc或cb 連續出現時,你可以把它們替換...
給定乙個字串,僅由a,b,c 3種小寫字母組成。
package com.boco.study 題目詳情 給定乙個字串,僅由a,b,c 3種小寫字母組成。當出現連續兩個不同的字母時,你可以用另外乙個字母替換它,如 有ab或ba連續出現,你把它們替換為字母c 有ac或ca連續出現時,你可以把它們替換為字母b 有bc或cb 連續出現時,你可以把它們替換...
隨機生成驗證碼(由數字 大小寫字母組成)
大寫 a 65,b 66,c 67,d 68,e 69,f 70,g 71,h 72,i 73,j 74,k 75,l 76,m 77,n 78,o 79,p 80,q 81,r 82,s 83,t 84,u 85,v 86,w 87,x 88,y 89,z 90 小寫 a 97,b 98,c 99...