字串消除

2022-09-23 17:39:10 字數 999 閱讀 6303

給定乙個字串,僅由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。 

一看這個題就是乙個需要求最優解的問題,考慮使用動態規劃演算法,

從字串的最開始開始搜尋,發現第乙個不相同的字元,記下位置

從這個位置開始,先把他和他後面的合併,產生乙個新字串

然後把他後面的和他後面的後面合併,產生第二個新字串

比較這兩個字串連續一樣的字元數量,取小的那個

接著遞推這個演算法,直到所有的字元都一樣為止。

打個比方,題目中所說的bcab。

發現第乙個不相同的字元,記下位置,位置為0,因為第0個和第1個就不一樣。

把他和他後面的合併,產生乙個新字串 bc合併,字串變成 aab

把他後面的和他後面的後面合併,產生第二個新字串 , ca合併,變成 bbb

aab和bbb比較,第乙個只有兩個連續相同的,第二個有三個連續相同的,捨棄第二個,取第乙個

把aab接著按演算法進行計算。

程式設計的時候稍微注意一下字串的結尾,別溢位去了。

演算法比較簡單,就寫個主要函式吧,github上有全部的。  

int _minlength(string s)

{ cout <  

字串消除

給定乙個字串,僅由a,b,c 3種小寫字母組成。當出現連續兩個不同的字母時,你可以用另外乙個字母替換它,如 有ab或ba連續出現,你把它們替換為字母c 有ac或ca連續出現時,你可以把它們替換為字母b 有bc或cb 連續出現時,你可以把它們替換為字母a。你可以不斷反覆按照這個規則進行替換,你的目標是...

字串消除

題目詳情 給定乙個字串,僅由a,b,c 3種小寫字母組成。當出現連續兩個不同的字母時,你可以用另外乙個字母替換它,如 有ab或ba連續出現,你把它們替換為字母c 有ac或ca連續出現時,你可以把它們替換為字母b 有bc或cb 連續出現時,你可以把它們替換為字母a。你可以不斷反覆按照這個規則進行替換,...

字串消除

小hi最近在玩乙個字元消除遊戲。給定乙個只包含大寫字母 abc 的字串s,消除過程是如下進行的 1 如果s包含長度超過1的由相同字母組成的子串,那麼這些子串會被同時消除,餘下的子串拼成新的字串。例如 abccbcccaa 中 cc ccc 和 aa 會被同時消除,餘下 ab 和 b 拼成新的字串 a...