簡化僅由a,b,c 3種小寫字母組成的字串

2021-06-18 07:29:31 字數 1082 閱讀 1129

題目詳情:給定乙個字串,僅由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...