Easy
题目描述
给你一个整数 n,请你返回一个含 n 个字符的字符串,其中每种字符在该字符串中都恰好出现奇数次。
返回的字符串必须只含有小写英文字母。如果存在多个满足题目要求的字符串,则可以返回其中任意一个。
示例 1:
输入:n = 4
输出:"pppz"
解释:"pppz" 是一个满足题目要求的字符串,因为 'p' 出现了三次,且 'z' 出现了一次。注意,还有很多其他满足题目要求的字符串,诸如 "ohhh" 和 "love"。
示例 2:
输入:n = 2
输出:"xy"
解释:"xy" 是一个满足题目要求的字符串,因为 'x' 和 'y' 各出现了一次。注意,还有很多其他满足题目要求的字符串,诸如 "ag" 和 "ur"。
示例 3:
输入:n = 7
输出:"holasss"
提示:
1 <= n <= 500
解题思路
这道题的核心在于理解什么样的字符组合能够满足"每种字符都恰好出现奇数次"的要求。
思路分析:
最直观的解法是根据 n 的奇偶性来构造字符串:
当 n 为奇数时:我们可以用
n个相同的字符(如 ‘a’)来构成字符串,因为 n 本身就是奇数。当 n 为偶数时:我们不能只用一种字符,因为偶数个相同字符不满足要求。但我们可以用
n-1个字符 ‘a’ 和 1 个字符 ‘b’,这样 ‘a’ 出现n-1(奇数)次,‘b’ 出现 1(奇数)次。
为什么这样可行?
- 奇数 + 奇数 = 偶数
- 偶数 + 奇数 = 奇数
所以当 n 为偶数时,我们需要至少两种字符,且每种字符的出现次数都是奇数,这样总和才能是偶数。
推荐解法:基于奇偶性的简单构造方法,时间复杂度最优且代码简洁。
代码实现
class Solution {
public:
string generateTheString(int n) {
if (n % 2 == 1) {
return string(n, 'a');
} else {
return string(n - 1, 'a') + 'b';
}
}
};
class Solution:
def generateTheString(self, n: int) -> str:
if n % 2 == 1:
return 'a' * n
else:
return 'a' * (n - 1) + 'b'
public class Solution {
public string GenerateTheString(int n) {
if (n % 2 == 1) {
return new string('a', n);
} else {
return new string('a', n - 1) + 'b';
}
}
}
/**
* @param {number} n
* @return {string}
*/
var generateTheString = function(n) {
if (n % 2 === 1) {
return 'a'.repeat(n);
} else {
return 'a'.repeat(n - 1) + 'b';
}
};
复杂度分析
| 解法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 奇偶性构造 | O(n) | O(1) |
说明:
- 时间复杂度:O(n),需要构造长度为 n 的字符串
- 空间复杂度:O(1),除了返回结果外,只使用常数额外空间