构造最长的新字符串

97 阅读2分钟

🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->构造最长的新字符串

问题描述

给你三个整数  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 + AABB+BBAA+ABAB+BB,我们只需要避免这几种直接相连的情况即可。

我们可以直接将AABB两种字符串交替拼接:得到AABB……AABBBBAA……AABBAABB……BBAA,再将所有AB字符串拼接起来,得到ABAB……ABAB,再将ABAB……ABAB拼接在BB的后面或者是AA的前面。

如示例一:x = 2, y = 5, z = 1

我们先将AABB两种字符串交替拼接得到:BBAABBAABB,将所有AB字符串拼接起来得到:AB,将AB随便插入到字符串中BA的中间即可,得到最长的字符串:BBABAABBAABB

所以拼接得到字符串的长度取决于AABB两种字符串之间数量较少的一种,如果这两种字符串的数量不相等的话,那么这两种字符串可以组成的字符串长度为:

(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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,在此谢谢大家的支持,我们下文再见 🙌。