目录

数据结构(二):字符串

最小表示法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def minimal(s):
    n = len(s)
    i,j,a = 0,1,0
    while i<n and j<n and a<n:
        x,y = s[(i+a)%n],s[(j+a)%n]
        if x==y:
            a += 1
        elif x>y:
            i,j,a = j,max(i+a,j)+1,0
        else:
            j,a = j+a+1,0
    return s[i:]+s[:i]
  • 3406 从盒子中找出字典序最大的字符串 II

字符串匹配

正则

  • 0008 字符串转换整数 (atoi)
  • 0044 通配符匹配
  • 0065 有效数字

kmp

  • 0005 最长回文子串
  • 0028 实现 strStr()
  • 1392 最长快乐前缀

macher

  • 0214 最短回文串

后缀数组

后缀数组

  • 0187 重复的DNA序列
  • 0718 最长重复子数组
  • 1044 最长重复子串
  • 1316 不同的循环子字符串
  • 1923 最长公共子路径

字典树

字典树 (Trie)

1
2
3
4
5
# 基于哈希表
T = lambda: defaultdict(T)
trie = T()
for w in words:
	reduce(dict.__getitem__, w, trie)['#'] = w
  • 0208 实现 Trie (前缀树)
  • 0212 单词搜索 II
  • 0588 设计内存文件系统
  • 0642 设计搜索自动补全系统
  • 0745 前缀和后缀搜索

01字典树

  • 0421 数组中两个数的最大异或值
  • 1707 与数组中元素的最大异或值
  • 1938 查询最大基因差

AC自动机