字符串 解题模板

适用场景

字符串匹配、子串操作、字符统计、格式转换

通用模板

双指针(回文 / 反转)

 
# 验证回文
 
l, r = 0, len(s)-1
 
while l < r:
 
    while l < r and not s[l].isalnum(): l += 1
 
    while l < r and not s[r].isalnum(): r -= 1
 
    if s[l].lower() != s[r].lower(): return False
 
    l += 1; r -= 1
 

KMP(字符串匹配)

 
# 构建 next 数组
 
def build_next(pattern):
 
    next_arr = [0] * len(pattern)
 
    j = 0
 
    for i in range(1, len(pattern)):
 
        while j > 0 and pattern[i] != pattern[j]:
 
            j = next_arr[j-1]
 
        if pattern[i] == pattern[j]:
 
            j += 1
 
            next_arr[i] = j
 
    return next_arr
 

模拟竖式运算

 
# 字符串相加
 
i, j, carry = len(a)-1, len(b)-1, 0
 
res = []
 
while i >= 0 or j >= 0 or carry:
 
    n1 = int(a[i]) if i >= 0 else 0
 
    n2 = int(b[j]) if j >= 0 else 0
 
    total = n1 + n2 + carry
 
    carry = total // 10
 
    res.append(str(total % 10))
 
    i -= 1; j -= 1
 

复杂度总结

模式时间空间典型题
双指针O(n)O(1)回文串、反转单词
KMPO(m+n)O(m)字符串匹配
滑动窗口O(n)O(k)无重复子串、覆盖子串
模拟竖式O(max(m,n))O(max(m,n))相加、相乘

→ 查看该分类题目:LeetCode学习路线图 > 二、字符串


关联题型

关联题型常见结合方式典型题目
滑动窗口子串问题 + 窗口维护3无重复字符最长子串
动态规划字符串匹配、编辑距离72编辑距离
数组与哈希字符计数 + 哈希表242有效字母异位词