【Leetcode】984. String Without AAA or BBB(配数学证明)
题目地址:
https://leetcode.com/problems/string-without-aaa-or-bbb/
给定两个数xxx和yyy,都是非负整数,要求返回任意一个字符串,其含xxx个a
与y与y与y个b
,并且其不含aaa
或者bbb
作为其子串。题目保证有解。
思路是,开一个数组sss,先将次数多的那个字母填满sss,不妨设x≥yx\ge yx≥y,那就用a
将sss填满,然后考虑将其中的a
替换为b
。我们考虑从s[2]s[2]s[2]开始,每隔333这个长度就填b
,这样能尽量达到不存在aaa
的效果。如果b
没用完,那就再从s[1]s[1]s[1]开始,也是每隔333这个长度就填b
,用完为止。
算法正确性证明:
首先,按上面方法得到的字符串一定是合法的。如果第一遍填b
用完了,但仍然存在aaa
这个子串(显然bbb
是不会存在的。如果仍然不合法,那只能说明存在aaa
),那这个aaa
一定存在于末尾,此时由鸽笼原理,无论怎么排都必须存在aaa
,与题目保证有解矛盾;如果第一遍填b
用完了并且合法,那问题已经解决;如果第一遍填b
用完了,但第二遍填b
没用完,那就说明b
的数量更多,这与上面方法的假设矛盾;如果第二遍用完了,则一定得到合法解。所以算法正确。
代码如下:
import java.util.Arrays;public class Solution {public String strWithout3a3b(int A, int B) {char[] str = new char[A + B];char c1 = 'a', c2 = 'b';if (A < B) {c1 = 'b';c2 = 'a';int in = A;A = B;B = in;}Arrays.fill(str, c1);for (int i = 2; i < str.length; i += 3) {if (B > 0) {str[i] = c2;B--;}}// 如果第一遍填写B用完了,则直接返回答案if (B == 0) {return new String(str);}for (int i = 1; i < str.length; i += 3) {if (B > 0) {str[i] = c2;B--;}}return new String(str);}
}
时空复杂度O(x+y)O(x+y)O(x+y)。
【Leetcode】984. String Without AAA or BBB(配数学证明)相关推荐
- LeetCode 984. 不含 AAA 或 BBB 的字符串(贪心)
1. 题目 给定两个整数 A 和 B,返回任意字符串 S,要求满足: S 的长度为 A + B,且正好包含 A 个 'a' 字母与 B 个 'b' 字母: 子串 'aaa' 没有出现在 S 中: 子串 ...
- 【Leetcode】1526. Minimum Number of Increments on Subarrays to Form a Target Array(配数学证明)
题目地址: https://leetcode.com/problems/minimum-number-of-increments-on-subarrays-to-form-a-target-array ...
- 【CodeForces】CF13C Sequence(配数学证明)
题目地址: https://www.luogu.com.cn/problem/CF13C 题面翻译: 给定一个序列,每次操作可以把某个数加111或者减111.要求把序列变成非降数列.而且要求修改后的数 ...
- 【洛谷】P2708 硬币翻转(配数学证明)
题目地址: https://www.luogu.com.cn/problem/P2708 题目描述: 有很多个硬币摆在一行,有正面朝上的,也有背面朝上的.正面朝上的用111表示,背面朝上的用000表示 ...
- 【洛谷】P1150 Peter的烟(配数学证明)
题目地址: https://www.luogu.com.cn/problem/P1150 题目描述: Peter有nnn根烟,他每吸完一根烟就把烟蒂保存起来,kkk(k>1k>1k> ...
- 【ACWing】2135. 马步距离(配数学证明)
题目地址: https://www.acwing.com/problem/content/description/2137/ 在国际象棋和中国象棋中,马的移动规则相同,都是走"日" ...
- 不含 AAA 或 BBB 的字符串
给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 B 的最大值和 B 的最小值之间 ...
- 【细节实现题】LeetCode 8. String to Integer (atoi)
LeetCode 8. String to Integer (atoi) Solution1:我的答案 参考链接:http://www.cnblogs.com/grandyang/p/4125537. ...
- LeetCode 8. String to Integer (atoi)(字符串)
LeetCode 8. String to Integer (atoi)(字符串) LeetCode 8 String to Integer atoi字符串 问题描述 解题思路 参考代码 By Sca ...
最新文章
- centos 6.3 安装reids
- HTML5中常用的标签(及标签的属性和作用)
- MapReduce基础开发之十三FileSystem实现本地文件上传
- DFT - Introduction to Test Models
- 1030 Travel Plan (30 分) 【难度: 中 / 知识点: 最短路】
- 启动器和选择器学习-----(5)启动器
- 1625 宝石项链 大视野评测
- app mvc框架_Google App Engine上的Spring MVC和REST
- 《奇点来临》——阿西莫夫三大定律
- U盘的针脚板竟然掉了
- php录音功能,h5做出网页录音功能
- Python的函数使用
- Pentaho RestAPI用户角色管理
- 计算机教室如何防火,校园防火及火灾逃生自救安全常识
- Emitter使用方法
- 什么是CDN?CDN和DNS有哪些关系和区别?
- linux系统配置交换机指令,【001】H3C交换机命令使用介绍
- LORA1276/1278 CAD检测功能测试
- DNSPod十问黄欢:为什么互联网大厂都要去造车?
- iPhone 双卡双待时代即将来临?