Java&C++题解与拓展——leetcode2038.如果相邻两个颜色均相同则删除当前颜色【没啥新知识】

这篇博客探讨了一道关于字符串游戏中Alice和Bob胜负判断的算法问题。通过分析字符串中连续出现的字符,可以计算出每个玩家可进行的操作次数,从而决定胜利者。博主提供了两种Java和C++的实现方式,时间复杂度均为O(n),空间复杂度分别为O(n)和O(1)。文章结尾还分享了对问题的简单总结和趣味吐槽。
摘要由CSDN通过智能技术生成
每日一题做题记录,参考官方和三叶的题解

题目要求

在这里插入图片描述

思路

分析题目可以发现,给出字符串后,可以删除的A和B的数量是确定的,不会随着操作改变,所以只要统计符合条件的A/B数量进行比较即可。

实现一

Java

class Solution {
    public boolean winnerOfGame(String colors) {
        char[] c = colors.toCharArray();
        int len = c.length;
        int a = 0, b = 0; //Alice和Bob可操作的步骤数量
        for(int i = 1; i< len - 1; i++) {
            if(c[i] == 'A' && c[i - 1] == 'A' && c[i + 1] == 'A')
                a++;
            if(c[i] == 'B' && c[i - 1] == 'B' && c[i + 1] == 'B')
                b++;
        }
        return a > b;
    }
}
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n),因为toCharArray操作会产生新数组,若直接使用colors.charAt(i)可减少到O(1)。

C++

class Solution {
public:
    bool winnerOfGame(string colors) {
        int len = colors.length();
        int a = 0, b = 0;
        for(int i = 1; i < len; i++) {
            if(colors[i] == 'A' && colors[i - 1] == 'A' && colors[i + 1] == 'A')
                a++;
            if(colors[i] == 'B' && colors[i - 1] == 'B' && colors[i + 1] == 'B')
                b++;
        }
        return a > b;
    }
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

实现二

Java

class Solution {
    public boolean winnerOfGame(String colors) {
        int[] freq = {0, 0};
        char cur = 'V';
        int cnt = 0;
        for(int i = 0; i < colors.length(); i++) {
            char c = colors.charAt(i);
            if(c != cur) {
                cur = c;
                cnt = 1;
            }
            else if(++cnt >= 3)
                ++freq[cur - 'A'];
        }
        return freq[0] > freq[1];
    }
}
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

C++

class Solution {
public:
    bool winnerOfGame(string colors) {
        int freq[2] = {0, 0};
        char cur = 'V';
        int cnt = 0;
        for(char c : colors) {
            if(c != cur) {
                cur = c;
                cnt = 1;
            }
            else if(++cnt >= 3)
                ++freq[cur - 'A'];
        }
        return freq[0] > freq[1];
    }
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

总结

本题还是很简单的,划分到中等感觉不至于,只要想清楚可删除数量不会随着操作改变,实现方法其实有很多种,其核心都是遍历一次整个字符串,所以各种方法时空复杂度区别也都不大。

小小吐槽

最后分享一个热评段子,吐槽一下这个游戏。
在这里插入图片描述


欢迎指正与讨论!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值