返回介绍

solution / 2700-2799 / 2745.Construct the Longest New String / README

发布于 2024-06-17 01:03:00 字数 3451 浏览 0 评论 0 收藏 0

2745. 构造最长的新字符串

English Version

题目描述

给你三个整数 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

解法

方法一:分类讨论

我们观察发现,字符串 'AA' 之后只能跟 'BB',而字符串 'AB' 可以放在字符串开头或结尾。因此:

  • 如果 $x \lt y$,那么我们可以先交替放置 'BBAABBAA..BB',一共放置 $x$ 个 'AA' 和 $x+1$ 个 'BB',然后放置剩余的 $z$ 个 'AB',总长度为 $(x \times 2 + z + 1) \times 2$;
  • 如果 $x \gt y$,那么我们可以先交替放置 'AABBAABB..AA',一共放置 $y$ 个 'BB' 和 $y+1$ 个 'AA',然后放置剩余的 $z$ 个 'AB',总长度为 $(y \times 2 + z + 1) \times 2$;
  • 如果 $x = y$,我们只需要交替放置 'AABB',一共放置 $x$ 个 'AA' 和 $y$ 个 'BB',然后放置剩余的 $z$ 个 'AB',总长度为 $(x + y + z) \times 2$。

时间复杂度 $O(1)$,空间复杂度 $O(1)$。

class Solution:
  def longestString(self, x: int, y: int, z: int) -> int:
    if x < y:
      return (x * 2 + z + 1) * 2
    if x > y:
      return (y * 2 + z + 1) * 2
    return (x + y + z) * 2
class Solution {
  public int longestString(int x, int y, int z) {
    if (x < y) {
      return (x * 2 + z + 1) * 2;
    }
    if (x > y) {
      return (y * 2 + z + 1) * 2;
    }
    return (x + y + z) * 2;
  }
}
class Solution {
public:
  int longestString(int x, int y, int z) {
    if (x < y) {
      return (x * 2 + z + 1) * 2;
    }
    if (x > y) {
      return (y * 2 + z + 1) * 2;
    }
    return (x + y + z) * 2;
  }
};
func longestString(x int, y int, z int) int {
  if x < y {
    return (x*2 + z + 1) * 2
  }
  if x > y {
    return (y*2 + z + 1) * 2
  }
  return (x + y + z) * 2
}
function longestString(x: number, y: number, z: number): number {
  if (x < y) {
    return (x * 2 + z + 1) * 2;
  }
  if (x > y) {
    return (y * 2 + z + 1) * 2;
  }
  return (x + y + z) * 2;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文