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