题目描述(LeetCode 482):License Key Formatting
你有一个密钥字符串 S
,其中包含字母、数字和短划线 -
。你需要将这个字符串重新格式化为一个由字母和数字组成的字符串,并且每 K
个字符之间用短划线分隔。
具体要求如下:
- 字符串
S
中只包含字母(大写和小写)、数字和短划线-
。 - 你需要将
S
中的短划线去掉,并将剩余的字符重新格式化。 - 格式化后的字符串中,每
K
个字符之间用短划线分隔,最后一个分组可能不满K
个字符。
示例:
输入:S = "5F3Z-2e-9-w", K = 4
输出:"5F3Z-2E9W"
解释:字符串 S
中的短划线被去掉,剩余的字符按每 4 个一组重新格式化,得到 "5F3Z-2E9W"
。
解题思路:
- 去除短划线:首先将字符串
S
中的所有短划线去掉。 - 反转字符串:为了方便从后往前每
K
个字符分组,可以将字符串反转。 - 分组并添加短划线:从反转后的字符串开始,每
K
个字符一组,添加短划线。 - 再次反转:将分组后的字符串再次反转,得到最终结果。
代码实现(Python):
class Solution:
def licenseKeyFormatting(self, S: str, K: int) -> str:
去除短划线并转换为大写
S = S.replace('-', '').upper()
# 反转字符串
S = S[::-1]
# 分组并添加短划线
result = []
for i in range(0, len(S), K):
result.append(S[i:i+K])
# 再次反转并连接成最终结果
formatted_key = '-'.join(result)[::-1]
return formatted_key
示例使用
sol = Solution() print(sol.licenseKeyFormatting("5F3Z-2e-9-w", 4)) # 输出: "5F3Z-2E9W"
详细解释:
-
去除短划线并转换为大写:
S = S.replace('-', '').upper()
这一步将输入字符串中的所有短划线去掉,并将所有字符转换为大写,以便统一格式。 -
反转字符串:
S = S[::-1]
反转字符串是为了方便从后往前每K
个字符进行分组。 -
分组并添加短划线:
result = [] for i in range(0, len(S), K): result.append(S[i:i+K])
通过循环,每K
个字符一组,将分组后的字符串添加到结果列表中。 -
再次反转并连接成最终结果:
formatted_key = '-'.join(result)[::-1]
将分组后的字符串列表用短划线连接起来,并再次反转,得到最终的格式化后的密钥字符串。
这种方法的时间复杂度为 O(N),其中 N 是字符串 S
的长度,空间复杂度也为 O(N),主要用于存储中间结果和最终结果。
发表回复