1. 程式人生 > 其它 >LeetCode-2038 如果相鄰兩個顏色均相同則刪除當前顏色

LeetCode-2038 如果相鄰兩個顏色均相同則刪除當前顏色

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/remove-colored-pieces-if-both-neighbors-are-the-same-color

題目描述

總共有 n 個顏色片段排成一列,每個顏色片段要麼是 'A' 要麼是 'B' 。給你一個長度為 n 的字串 colors ,其中 colors[i] 表示第 i 個顏色片段的顏色。

Alice 和 Bob 在玩一個遊戲,他們 輪流 從這個字串中刪除顏色。Alice 先手 。

如果一個顏色片段為 'A' 且 相鄰兩個顏色 都是顏色 'A' ,那麼 Alice 可以刪除該顏色片段。Alice 不可以 刪除任何顏色 'B' 片段。
如果一個顏色片段為 'B' 且 相鄰兩個顏色 都是顏色 'B' ,那麼 Bob 可以刪除該顏色片段。Bob 不可以 刪除任何顏色 'A' 片段。
Alice 和 Bob 不能 從字串兩端刪除顏色片段。
如果其中一人無法繼續操作,則該玩家 輸 掉遊戲且另一玩家 獲勝 。
假設 Alice 和 Bob 都採用最優策略,如果 Alice 獲勝,請返回 true,否則 Bob 獲勝,返回 false。

 

示例 1:

輸入:colors = "AAABABB"
輸出:true
解釋:
AAABABB -> AABABB
Alice 先操作。
她刪除從左數第二個 'A' ,這也是唯一一個相鄰顏色片段都是 'A' 的 'A' 。

現在輪到 Bob 操作。
Bob 無法執行任何操作,因為沒有相鄰位置都是 'B' 的顏色片段 'B' 。
因此,Alice 獲勝,返回 true 。
示例 2:

輸入:colors = "AA"
輸出:false
解釋:
Alice 先操作。
只有 2 個 'A' 且它們都在字串的兩端,所以她無法執行任何操作。
因此,Bob 獲勝,返回 false 。
示例 3:

輸入:colors = "ABBBBBBBAAA"
輸出:false
解釋:
ABBBBBBBAAA -> ABBBBBBBAA
Alice 先操作。
她唯一的選擇是刪除從右數起第二個 'A' 。

ABBBBBBBAA -> ABBBBBBAA
接下來輪到 Bob 操作。
他有許多選擇,他可以選擇任何一個 'B' 刪除。

然後輪到 Alice 操作,她無法刪除任何片段。
所以 Bob 獲勝,返回 false 。
 

提示:

1 <= colors.length <= 105
colors 只包含字母 'A' 和 'B'

 

解題思路

看著挺唬人的,特別是之前做過博弈題,很容易被嚇到,但是其實題目中他們兩個的操作都不影響彼此,所以簡單的統計他們可以進行操作的次數就好了。

程式碼展示

class Solution {
public:
    bool winnerOfGame(string
colors) { int iCountA = 0, iCountB = 0; if(colors.size() < 2) return false; for(int i = 1; i < colors.size() - 1; i++) { if(colors[i] == 'A' && colors[i + 1] == 'A' && colors[i - 1] == 'A') iCountA++; if(colors[i] == 'B' && colors[i + 1] == 'B' && colors[i - 1] == 'B') iCountB++; } return iCountA > iCountB ? true : false; } };

執行結果