題目詳情
給定乙個字串,僅由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。
這個題目我沒有想出來,看了網上幾個高手的解答之後算是理解了,感覺自己在數學思維上還是差太遠了.
首先可以舉出特殊情況:即輸入全是同一字元,這時的最短長度自然就是字串的長度.
接下來看看可能的取值範圍:假設字串的開頭是'a', 'b', 'c'
接下來給出'a',字串可以轉化為'a', 'b', 'b'或'c','c','a'.
接下來給出'b',字串可以轉化為'a', 'b', 'a'或'c','c','b', 或'a','a','b'.
接下來給出'c',字串可以轉化為'a', 'a', 'c'.
總之,新字串的長度可以保證依然為3,對於"aab","aba","abb"也可以像上面一樣轉換,即字串的總可以消除到3的長度(不包括"aaa"這種情形),而3長度的字串又可以消減到1長度或2長度,即字串的長度總可以消減到1或2.
現在引入乙個特徵向量(x, y, z)代表'a','b','c'字元數量的奇偶性.
1.當初狀態為(1, 1, 1)即全奇時,任何一種變換都會導致三個數奇偶性同時變化(兩個數量減一,乙個數量加一),特徵向量變為(0,0,0).
2.當初狀態為(0, 0, 0)即全偶時,任何一種變換都會導致奇偶性變為(1, 1, 1).
3.當初狀態為(x, y, z)(x + y + z == 1)時,任何一種變換都會導致(x, y, z)(x + y + z == 2).
4.當初狀態為(x, y, z)(x + y + z == 2)時,任何一種變換都會導致(x, y, z)(x + y + z == 1).
從前文可知對於任意長度的非單一字串,總可以縮減到3長度
此時若為"abc", 即特徵向量為(1, 1, 1),再變換即可得長度為0, 0, 2的一種排列
此時若為"abb",即特徵向量為(1, 0, 0), 再變換即可得長度為0, 0 ,1的一種排列.
即當初始字串中字元的的奇偶性相同時,最短消除長度為2,其他為1.
字串消除
給定乙個字串,僅由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...
消除字串
蒜頭君喜歡中心對稱的字串,即回文字串。現在蒜頭君手裡有乙個字串 s s,蒜頭君每次都會進行這樣的操作 從 s s 中挑選乙個回文的子串行,將其從字串 s s 中去除,剩下的字元重組成新的字串 ss。蒜頭君想知道,最少可以進行多少次操作,可以消除整個字串。輸入一行。輸入乙個字串 s s 1 leq l...