给定两个整数 AB,返回任意字符串 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"

提示:

  1. 0 <= A <= 100
  2. 0 <= B <= 100
  3. 对于给定的 AB,保证存在满足要求的 S

解题思路

这个问题非常简单(其实这是一个数学问题),我们首先想到的解法是贪心算法。我们可以分成如下几种情况去判断

  • A = B A=B A=B
  • A &gt; B ​ A &gt; B​ A>B​
  • A &lt; B A &lt; 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)。我们首先判断difB谁大?如果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 的字符串(超详细的解法!!!)相关推荐

  1. LeetCode 984. 不含 AAA 或 BBB 的字符串(贪心)

    1. 题目 给定两个整数 A 和 B,返回任意字符串 S,要求满足: S 的长度为 A + B,且正好包含 A 个 'a' 字母与 B 个 'b' 字母: 子串 'aaa' 没有出现在 S 中: 子串 ...

  2. 不含 AAA 或 BBB 的字符串

    给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 B 的最大值和 B 的最小值之间 ...

  3. Leetcode 1135:最低成本联通所有城市(超详细的解法!!!)

    想象一下你是个城市基建规划者,地图上有 N 座城市,它们按以 1 到 N 的次序编号. 给你一些可连接的选项 conections,其中每个选项 conections[i] = [city1, cit ...

  4. Leetcode 957:N 天后的牢房(超详细的解法!!!)

    8 间牢房排成一排,每间牢房不是有人住就是空着. 每天,无论牢房是被占用或空置,都会根据以下规则进行更改: 如果一间牢房的两个相邻的房间都被占用或都是空的,那么该牢房就会被占用. 否则,它就会被空置. ...

  5. Leetcode 297:二叉树的序列化与反序列化(超详细的解法!!!)

    序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来实现二叉 ...

  6. 【Leetcode】984. String Without AAA or BBB(配数学证明)

    题目地址: https://leetcode.com/problems/string-without-aaa-or-bbb/ 给定两个数xxx和yyy,都是非负整数,要求返回任意一个字符串,其含xxx ...

  7. Leetcode 1162:地图分析(超详细的解法!!!)

    你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗 ...

  8. Leetcode 37:解数独(超详细的解法!!!)

    编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x3 ...

  9. Leetcode 1229:安排会议日程(超详细的解法!!!)

    你是一名行政助理,手里有两位客户的空闲时间表:slots1 和 slots2,以及会议的预计持续时间 duration,请你为他们安排合适的会议时间. 「会议时间」是两位客户都有空参加,并且持续时间能 ...

最新文章

  1. css-padding
  2. leetcode -- 3.无重复字符的最长子串
  3. Spring远程支持和开发RMI服务
  4. 数值的整数次方(代码的完整性)
  5. 【RecSys】推荐系统和计算广告经典算法论文及实现总结
  6. rkmedia 中的行人检测
  7. 两个平面的位置关系和判定方程组解_2018年高考数学总复习第九章平面解析几何第2讲两直线的位置关系学案!...
  8. java正则表达式 用户名_java之正则表达式
  9. 【参考】MTK线刷工具错误代码大全及解决方法
  10. js页面刷新事件 ,Javascript刷新页面的几种方法
  11. DELL EMC Isilon配额Quota
  12. Elasticsearch 7.13 删除文档后如何释放存储空间、手动执行forcemerge操作
  13. 小猪短租陈驰:共享经济不是简单的资本游戏
  14. 〖小狼毫〗小狼毫使用心得分享
  15. 深度学习分类常见评价指标:accuracy recall precision specificity sensitivity AUC ROC 曲线
  16. 使用SSH密钥连接阿里云linux服务器
  17. bit feild and CPU endian 位域和大小端
  18. eureka:自我保护机制_对自我怀疑的开发人员:您足够好吗?
  19. 红豆角源码--红豆角系统红豆角APP拼团系统源码分享
  20. 软件工程学习(十)常见的软件架构

热门文章

  1. MySQL --- 窗口函数
  2. 【科普知识】电机的10种工作制说明:S1~S10
  3. 【论文笔记】Shortest Paths and Centrality in Uncertain Networks
  4. 记录手贱修改win10 msconfig导致开机蓝屏解决方法
  5. PAC模式和全局模式
  6. 计算机毕业设计SSM大学生兼职平台【附源码数据库】
  7. C# 耗时统计器(简单)
  8. 洛谷 P2307 迷宫
  9. android build.prop文件
  10. JM8.6编解码器中trace_enc.txt和trace_dec.txt文件的功能