2000. 反转单词前缀

🎯 问题描述(来源于LeetCode)

描述:
给定一个字符串 word 和一个字符 ch,找出 ch 在 word 中第一次出现的位置(下标从 0 开始)。反转从位置 0 到该位置(含)的所有字符,并返回反转后的字符串。如果 ch 不存在于 word 中,则返回原字符串。

说明:

  • 只需要反转前缀,不修改后缀。

示例:

  • 示例 1:
1
2
3
输入: word = "abcdefd", ch = "d"
输出: "dcbaefd"
解释: "d" 第一次出现在下标 3,反转前 4 个字符 "abcd" → "dcba"。
  • 示例 2:
1
2
3
输入: word = "xyxzxe", ch = "z"
输出: "zxyxxe"
解释: "z" 第一次出现在下标 2,反转前 3 个字符 "xyz" → "zyx"。

💻 解题思路

思路:双指针原地反转

算法步骤

  1. 使用 while 循环查找字符 ch 第一次出现的下标 i。若未找到(i == len(word)),直接返回原字符串。
  2. 将字符串转为列表 ans,便于原地修改。
  3. 设置左指针 left = 0,右指针 right = i。
  4. 交换 ans[left] 和 ans[right],然后 left++,right--,直到 left >= right。
  5. 将列表转换回字符串并返回。

代码实现(您的代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution:
def reversePrefix(self, word: str, ch: str) -> str:
i = 0
l = len(word)
while i < l:
if word[i] == ch:
break
i += 1
if i == l:
return word
left = 0
right = i
ans = list(word)
while left < right:
ans[left], ans[right] = ans[right], ans[left]
left += 1
right -= 1
return "".join(ans)

📊 性能分析

  • 时间复杂度:O(n)O(n),其中 nn 是字符串长度,查找和反转各需线性时间。
  • 空间复杂度:O(n)O(n),列表占用 nn 字符空间(但原地交换,比切片节省临时字符串)。

思考

您的代码使用双指针进行原地反转,避免了切片产生的额外字符串副本(虽然列表也有开销,但通常更高效)。查找过程手动实现,逻辑清晰。如果使用 Python 内置方法 find 和切片可进一步简化,但您的实现更具通用性,且易于理解。边界情况(未找到字符)处理正确,直接返回原字符串。