字符串处理经典算法题解析与实现
反转字符数组
题目要求将给定的字符数组内容原地反转,即不能使用额外的数组空间。解决方案采用双指针技术:一个指针从起始位置开始,另一个从末尾出发,两者逐步向中间靠拢,同时交换对应位置的字符。
class Solution:
def reverseArrayInPlace(self, chars: List[str]) -> None:
start = 0
end = len(chars) - 1
while start < end:
chars[start], chars[end] = chars[end], chars[start]
start += 1
end -= 1
时间复杂度为 O(n),其中 n 是字符数量;空间复杂度为 O(1),仅使用了常量级辅助变量。
按规则翻转子串
给定字符串 s 和整数 k,每 2k 个字符为一组,对每一组的前 k 个字符进行反转。若剩余字符不足 k 个,则全部反转;若在 k 到 2k 之间,只反转前 k 个。
实现方式是通过索引步进,每次前进 2k 步,并利用切片操作完成局部逆序。
class Solution:
def reverseSegments(self, s: str, k: int) -> str:
index = 0
result = list(s)
while index < len(result):
left = index
right = min(index + k - 1, len(result) - 1)
# Reverse manually to simulate in-place behavior
while left < right:
result[left], result[right] = result[right], result[left]
left += 1
right -= 1
index += 2 * k
return ''.join(result)
数字替换为指定字符串
输入一个混合了小写字母和数字的字符串,需将所有数字字符替换为 "number" 字符串。由于 Python 中字符串不可变,应先转换为列表处理,最后再合并成字符串输出。
s = input().strip()
chars = list(s)
for i in range(len(chars)):
if chars[i].isdigit():
chars[i] = 'number'
print(''.join(chars))
逆序单词排列
目标是将句子中单词的顺序颠倒,但每个单词内部保持不变。同时需要去除多余的空格(包括首尾和中间多个空格),最终以单个空格分隔各单词。
首先使用 strip() 去除两端空白,split() 按任意空白分割得到单词列表,然后用双指针交换实现逆序。
class Solution:
def reverseWordOrder(self, sentence: str) -> str:
words = sentence.strip().split()
left = 0
right = len(words) - 1
while left < right:
words[left], words[right] = words[right], words[left]
left += 1
right -= 1
return ' '.join(words)
右旋字符串操作
将字符串末尾的 k 个字符移动到开头,形成新的字符串。设总长度为 n,则新字符串由后 k 个字符拼接上前 n-k 个字符构成。
k = int(input())
text = input().strip()
n = len(text)
rotated = text[n - k:] + text[:n - k]
print(rotated)