🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->构造最长的新字符串
问题描述
给你三个整数 x ,y 和 z 。
这三个整数表示你有 x 个 "AA" 字符串,y 个 "BB" 字符串,和 z 个 "AB" 字符串。你需要选择这些字符串中的部分字符串(可以全部选择也可以一个都不选择),将它们按顺序连接得到一个新的字符串。新字符串不能包含子字符串 "AAA" 或者 "BBB" 。
请你返回新字符串的最大可能长度。
子字符串 是一个字符串中一段连续 非空 的字符序列。
示例 1:
输入: x = 2, y = 5, z = 1
输出: 12
解释: 我们可以按顺序连接 "BB" ,"AA" ,"BB" ,"AA" ,"BB" 和 "AB" ,得到新字符串 "BBAABBAABBAB" 。
字符串长度为 12 ,无法得到一个更长的符合题目要求的字符串。
示例 2:
输入: x = 3, y = 2, z = 2
输出: 14
解释: 我们可以按顺序连接 "AB" ,"AB" ,"AA" ,"BB" ,"AA" ,"BB" 和 "AA" ,得到新字符串 "ABABAABBAABBAA" 。
字符串长度为 14 ,无法得到一个更长的符合题目要求的字符串。
提示:
1 <= x, y, z <= 50
思路分析
首先我们应该要先理解一下题目意思,题目会给我们三个整数 x ,y 和 z,这三个整数表示我们有 x 个 "AA" 字符串,y 个 "BB" 字符串,和 z 个 "AB" 字符串。我们可以使用这三种字符串取拼接成一个新的字符串,新的字符串需要满足条件:不能包含子字符串 "AAA" 或者 "BBB" 。我们需要计算并返回新字符串的最大可能长度。
刚看到题目描述的时候是不是会觉得这道题目好像会比较复杂,我们需要根据描述去模拟拼接,将所有字符串都遍历判断一遍,但实际上并不用,我们只需要分析一下有哪些情况是不满足条件的,因为新的字符串不能包含子字符串 "AAA" 或者 "BBB" ,所以以下几种情况不能直接拼接:AA + AA、BB+BB、AA+AB、AB+BB,我们只需要避免这几种直接相连的情况即可。
我们可以直接将AA和BB两种字符串交替拼接:得到AABB……AABB、BBAA……AABB或AABB……BBAA,再将所有AB字符串拼接起来,得到ABAB……ABAB,再将ABAB……ABAB拼接在BB的后面或者是AA的前面。
如示例一:x = 2, y = 5, z = 1
我们先将AA和BB两种字符串交替拼接得到:BBAABBAABB,将所有AB字符串拼接起来得到:AB,将AB随便插入到字符串中BA的中间即可,得到最长的字符串:BBABAABBAABB。
所以拼接得到字符串的长度取决于AA和BB两种字符串之间数量较少的一种,如果这两种字符串的数量不相等的话,那么这两种字符串可以组成的字符串长度为:
(Math.min(x, y) * 2 + 1) * 2;
如果这两种字符串的数量相等的话,那么这两种字符串可以组成的字符串长度为:
Math.min(x, y) * 2 * 2;
AC 代码
完整 AC 代码如下:
/**
* @param {number} x
* @param {number} y
* @param {number} z
* @return {number}
*/
var longestString = function (x, y, z) {
return (Math.min(x, y) * 2 + (x == y ? 0 : 1) + z) * 2;
};
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,在此谢谢大家的支持,我们下文再见 🙌。