力扣——2027. 转换字符串的最少操作次数

86 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

力扣——2027. 转换字符串的最少操作次数

2027. 转换字符串的最少操作次数

难度简单55收藏分享切换为英文接收动态反馈

给你一个字符串 s ,由 n 个字符组成,每个字符不是 'X' 就是 'O'

一次 操作 定义为从 s 中选出 三个连续字符 并将选中的每个字符都转换为 'O' 。注意,如果字符已经是 'O' ,只需要保持 不变

返回将 s 中所有字符均转换为 'O' 需要执行的 最少 操作次数。

示例 1:

输入:s = "XXX"
输出:1
解释:XXX -> OOO
一次操作,选中全部 3 个字符,并将它们转换为 'O' 。

示例 2:

输入:s = "XXOX"
输出:2
解释:XXOX -> OOOX -> OOOO
第一次操作,选择前 3 个字符,并将这些字符转换为 'O' 。
然后,选中后 3 个字符,并执行转换。最终得到的字符串全由字符 'O' 组成。

示例 3:

输入:s = "OOOO"
输出:0
解释:s 中不存在需要转换的 'X' 。

提示:

  • 3 <= s.length <= 1000
  • s[i]'X''O'

问题解析

贪心即可。

从左到右遍历数组,每当遇到x字符,就把接下来三个字符都变成都变成O(不管是不是x字符),操作数++。

具体实现:

  1. cnt表示接下来有一个字符要变化,ans表示操作数。
  2. 遍历数组,如果cnt不为0,就把当前字符变成‘O',cnt--。
  3. 如果cnt为0,且当前字符是’X‘,就把当前字符变成’O',ans++,并把cnt变成2.
class Solution {
public:
    int minimumMoves(string s) {
        int n=s.size(),cnt=0,ans=0;
        for(int i=0;i<n;i++)
        {
            if(cnt)
            {
                cnt--;
                s[i]='O';
            }
            else if(s[i]=='X')
            {
                s[i]='O';
                cnt=2;
                ans++;
            }
        }
        return ans;
    }
};

但实际上不用一个个遍历,遇到x之后,我们直接跳到往后第三个位置继续遍历数组即可。

class Solution {
public:
    int minimumMoves(string s) {
        int n=s.size(),ans=0;
        for(int i=0;i<n;i++)
        {
            if(s[i]=='X')
            {
                i+=2;
                ans++;
            }
        }
        return ans;
    }
};