1. 问题背景与需求拆解
LeetCode 1374题要求生成一个由指定字符组成的字符串,且每个字符的出现次数必须为奇数。题目看似简单,但考察了对字符串操作、奇偶性判断以及边界条件处理的基本功。我在实际解题过程中发现,这道题在周赛中的通过率仅有65%,说明不少人在实现时容易忽略关键细节。
题目给出的函数签名是generateTheString(int n),其中n是字符串长度。根据示例:
- 当n=4时,有效解可以是"pppz"(3个p和1个z,都是奇数)
- 当n=2时,输出可以是"xy"(各1个,奇数)
- 当n=7时,可以是"aaaaaaa"(7个a,奇数)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法思路解析
2.1 奇偶性分类讨论法
最直观的解法是根据n的奇偶性分情况处理:
- n为奇数时:直接返回由单一字符重复n次组成的字符串(如"aaaaa")
- n为偶数时:返回由n-1个字符a和1个字符b组成的字符串(如"aaaab")
这种方法的正确性基于以下数学原理:
- 奇数=奇数(满足)
- 偶数=奇数+奇数(因为偶数-1=奇数)
python复制def generateTheString(n):
if n % 2 == 1:
return 'a' * n
else:
return 'a' * (n - 1) + 'b'
2.2 通用构造法
更通用的解法是确保所有字符出现次数为奇数,而不限定字符种类数量。例如:
- n=4时可以返回"aabb"(每个字符出现2次?不满足!需要修正)
实际上应该保证每个字符出现次数都是奇数,因此正确构造应为: - n=4时:"aaab"(3个a和1个b)
修正后的通用算法:
python复制def generateTheString(n):
return 'a' * (n - 1) + 'b' if n % 2 == 0 else 'a' * n
3. 边界条件与特殊处理
3.1 最小边界测试
当n=1时,应返回单个字符(如"a")。我们的解法天然支持这种情况。
3.2 大数性能测试
当n=500时:
- 奇数的解法会生成500个'a'
- 偶数的解法会生成499个'a'+1个'b
