LeetCode探索(109):1374-生成每种字符都是奇数个的字符串

1,171 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情 >>

题目

给你一个整数 n,请你返回一个含 n 个字符的字符串,其中每种字符在该字符串中都恰好出现 奇数次

返回的字符串必须只含小写英文字母。如果存在多个满足题目要求的字符串,则返回其中任意一个即可。

示例 1:

输入:n = 4
输出:"pppz"
解释:"pppz" 是一个满足题目要求的字符串,因为 'p' 出现 3 次,且 'z' 出现 1 次。当然,还有很多其他字符串也满足题目要求,比如:"ohhh""love"

示例 2:

输入:n = 2
输出:"xy"
解释:"xy" 是一个满足题目要求的字符串,因为 'x''y' 各出现 1 次。当然,还有很多其他字符串也满足题目要求,比如:"ag""ur"

示例 3:

输入:n = 7
输出:"holasss"

提示:

  • 1 <= n <= 500

思考

本题难度简单。

首先是读懂题意。给出正整数 n,返回一个字符串,需要满足字符串中的每种字符的数量均为奇数。

题目咋一看有点难度,不过,可以换种思路。分类讨论如下:当n为偶数时,可以只包含2种字符,其中一种字符的数量为1。当n为奇数时,只包含一种字符即可。这样,题目就很简单了!由于满足题意的字符串有很多种,我们只需要返回其中一个字符串即可。

解答

方法一:分类讨论

借助临时数组。

/**
 * @param {number} n
 * @return {string}
 */
var generateTheString = function(n) {
  let ans = new Array(n).fill('a').join('')
  if ((n & 1) === 0) {
    ans = ans.slice(0, ans.length - 1) + 'b'
  }
  return ans
}
// 执行用时:64 ms, 在所有 JavaScript 提交中击败了46.30%的用户
// 内存消耗:41.2 MB, 在所有 JavaScript 提交中击败了64.81%的用户
// 通过测试用例:103 / 103

复杂度分析:

  • 时间复杂度:O(n)。
  • 空间复杂度:O(n)。

方法二:分类讨论(优化)

没有使用临时数组,这里使用字符串拼接的方法。

/**
 * @param {number} n
 * @return {string}
 */
var generateTheString = function(n) {
  let ans = ''
  for (let i = 0; i < n; i++) {
    ans += 'a'
  }
  if ((n & 1) === 0) {
    ans = ans.slice(0, ans.length - 1) + 'b'
  }
  return ans
}
// 执行用时:56 ms, 在所有 JavaScript 提交中击败了88.89%的用户
// 内存消耗:40.9 MB, 在所有 JavaScript 提交中击败了94.44%的用户
// 通过测试用例:103 / 103

复杂度分析:

  • 时间复杂度:O(n)。
  • 空间复杂度:O(1)。

参考