Leetcode 984:不含 AAA 或 BBB 的字符串(超详细的解法!!!)
给定两个整数 A
和 B
,返回任意字符串 S
,要求满足:
S
的长度为A + B
,且正好包含A
个'a'
字母与B
个'b'
字母;- 子串
'aaa'
没有出现在S
中; - 子串
'bbb'
没有出现在S
中。
示例 1:
输入:A = 1, B = 2
输出:"abb"
解释:"abb", "bab" 和 "bba" 都是正确答案。
示例 2:
输入:A = 4, B = 1
输出:"aabaa"
提示:
0 <= A <= 100
0 <= B <= 100
- 对于给定的
A
和B
,保证存在满足要求的S
。
解题思路
这个问题非常简单(其实这是一个数学问题),我们首先想到的解法是贪心算法。我们可以分成如下几种情况去判断
- A = B A=B A=B
- A > B A > B A>B
- A < B A < B A<B
第一种情况很简单,我们直接返回'ab'*A
(或'ab'*B
)即可。对于第二种和第三种情况,我们都按照第二种考虑,对于第三种情况我们交换A,B
即可。接着我们判断当A or B
不为空的时候,如果A>B
的话,我们就添加aab
,否则我们添加ab
。
class Solution:def strWithout3a3b(self, A, B, a='a', b='b'):""":type A: int:type B: int:rtype: str"""if A == B:return (a+b)*Bif B > A: A, B = B, Aa, b = b, ares = ''while A or B:if A: res += aA -= 1if A > B:res += aA -= 1if B:res += bB -= 1return res
我们也可以继续优化这个问题,我们可以先计算dif=abs(A-B)
。我们首先判断dif
和B
谁大?如果B
更大的话,我们首先将'aab'*(A-B)
添加到res
中(因为此时aa
的数量最多为A-B
),然后再将'ab'*(B*2-A)
添加到结果中,例如A=4,B=3
,结果就是aababab
。如果dif>B
的话,我们首先将'aab'*B
添加到res
中(因为此时aa
的数量最多为B
,并且此时我们的b
也用完了),然后再将'a'*(A-2*B)
添加到结果中(题设中保证了我们一定会有结果,此时我们通过上面的策略一定是最优的,为什么?),例如A=4,B=1
,结果就是aabaa
。
class Solution:def strWithout3a3b(self, A, B, a='a', b='b'):""":type A: int:type B: int:rtype: str"""if A == B:return (a+b)*Bif B > A: A, B = B, Aa, b = b, aif A >= B * 2: return (a + a + b) * B + a * (A - B * 2)return (a + a + b) * (A - B) + (a + b) * (B * 2 - A)
这个问题使用递归的话,会更加简洁。递归的思路也非常简单,我们同样也只考虑三种情况,我们首先判断A>B
,如果成立,我们返回a*2+b+f(A-2,B-1)
,如果A==B
,我们返回(a+b)*A
,如果A<B
的话,我们返回f(B,A,b,a)
(也就是交换A,B
顺序)。接着考虑边界情况,也就是B==0
的话,我们只要返回A*a
即可。
class Solution:def strWithout3a3b(self, A, B, a='a', b='b'):""":type A: int:type B: int:rtype: str"""if B > A: return self.strWithout3a3b(B, A, b, a)if B == 0:return a*Aif A > B:return (a*2+b)+self.strWithout3a3b(A-2, B-1, a, b)else:return (a+b)+self.strWithout3a3b(A-1, B-1, a, b)
reference:
https://leetcode.com/problems/string-without-aaa-or-bbb/discuss/226649/JavaC%2B%2B-(and-Python)-simple-greedy
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!
Leetcode 984:不含 AAA 或 BBB 的字符串(超详细的解法!!!)相关推荐
- LeetCode 984. 不含 AAA 或 BBB 的字符串(贪心)
1. 题目 给定两个整数 A 和 B,返回任意字符串 S,要求满足: S 的长度为 A + B,且正好包含 A 个 'a' 字母与 B 个 'b' 字母: 子串 'aaa' 没有出现在 S 中: 子串 ...
- 不含 AAA 或 BBB 的字符串
给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 B 的最大值和 B 的最小值之间 ...
- Leetcode 1135:最低成本联通所有城市(超详细的解法!!!)
想象一下你是个城市基建规划者,地图上有 N 座城市,它们按以 1 到 N 的次序编号. 给你一些可连接的选项 conections,其中每个选项 conections[i] = [city1, cit ...
- Leetcode 957:N 天后的牢房(超详细的解法!!!)
8 间牢房排成一排,每间牢房不是有人住就是空着. 每天,无论牢房是被占用或空置,都会根据以下规则进行更改: 如果一间牢房的两个相邻的房间都被占用或都是空的,那么该牢房就会被占用. 否则,它就会被空置. ...
- Leetcode 297:二叉树的序列化与反序列化(超详细的解法!!!)
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来实现二叉 ...
- 【Leetcode】984. String Without AAA or BBB(配数学证明)
题目地址: https://leetcode.com/problems/string-without-aaa-or-bbb/ 给定两个数xxx和yyy,都是非负整数,要求返回任意一个字符串,其含xxx ...
- Leetcode 1162:地图分析(超详细的解法!!!)
你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗 ...
- Leetcode 37:解数独(超详细的解法!!!)
编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x3 ...
- Leetcode 1229:安排会议日程(超详细的解法!!!)
你是一名行政助理,手里有两位客户的空闲时间表:slots1 和 slots2,以及会议的预计持续时间 duration,请你为他们安排合适的会议时间. 「会议时间」是两位客户都有空参加,并且持续时间能 ...
最新文章
- css-padding
- leetcode -- 3.无重复字符的最长子串
- Spring远程支持和开发RMI服务
- 数值的整数次方(代码的完整性)
- 【RecSys】推荐系统和计算广告经典算法论文及实现总结
- rkmedia 中的行人检测
- 两个平面的位置关系和判定方程组解_2018年高考数学总复习第九章平面解析几何第2讲两直线的位置关系学案!...
- java正则表达式 用户名_java之正则表达式
- 【参考】MTK线刷工具错误代码大全及解决方法
- js页面刷新事件 ,Javascript刷新页面的几种方法
- DELL EMC Isilon配额Quota
- Elasticsearch 7.13 删除文档后如何释放存储空间、手动执行forcemerge操作
- 小猪短租陈驰:共享经济不是简单的资本游戏
- 〖小狼毫〗小狼毫使用心得分享
- 深度学习分类常见评价指标:accuracy recall precision specificity sensitivity AUC ROC 曲线
- 使用SSH密钥连接阿里云linux服务器
- bit feild and CPU endian 位域和大小端
- eureka:自我保护机制_对自我怀疑的开发人员:您足够好吗?
- 红豆角源码--红豆角系统红豆角APP拼团系统源码分享
- 软件工程学习(十)常见的软件架构
热门文章
- MySQL --- 窗口函数
- 【科普知识】电机的10种工作制说明:S1~S10
- 【论文笔记】Shortest Paths and Centrality in Uncertain Networks
- 记录手贱修改win10 msconfig导致开机蓝屏解决方法
- PAC模式和全局模式
- 计算机毕业设计SSM大学生兼职平台【附源码数据库】
- C# 耗时统计器(简单)
- 洛谷 P2307 迷宫
- android build.prop文件
- JM8.6编解码器中trace_enc.txt和trace_dec.txt文件的功能