字符串是生活中很常见的东西,于是,字符串就在算法中有着非常多的运用。
首先给出一点定义
字符集
字符集
Σ
\Sigma
Σ 是一个全序集,即
∀
α
,
β
∈
Σ
→
α
<
β
or
α
>
β
\forall \alpha, \beta \in \Sigma \rightarrow \alpha < \beta \quad \text{or} \quad \alpha > \beta
∀α,β∈Σ→α<βorα>β
字符集中的元素被称作字符。最常见的字符集是
26
26
26 个英文小写字母。
字符串
字符串
S
S
S 是由
n
n
n 个字符构成的有序的,可重复的集合。定义字符串长度
∣
S
∣
=
n
|S| = n
∣S∣=n。
在本作者所写的文章中,若无特殊说明,则字符串下标均从
0
0
0 开始。因此可以使用
S
[
i
−
1
]
S[i - 1]
S[i−1] 表示字符串
S
S
S 中的第
i
i
i 个字符。
子串
字符串
S
S
S 的子串
s
s
s 是
S
S
S 中连续的一段字符。形式化地,
s
=
S
[
i
⋯
j
]
,
∣
s
∣
=
j
−
i
,
0
≤
i
≤
j
s = S[i \cdots j], |s| = j - i, 0 \le i \le j
s=S[i⋯j],∣s∣=j−i,0≤i≤j
子序列
字符串
S
S
S 的子序列
s
s
s 是
S
S
S 中不连续的一段字符,但满足原字符串的前后排列顺序。形式化地,
s
=
S
[
p
1
]
+
S
[
p
2
]
+
⋯
+
S
[
p
n
]
,
∣
s
∣
=
n
,
0
≤
p
1
≤
p
2
≤
⋯
≤
p
n
≤
∣
S
∣
s = S[p_1] + S[p_2] + \cdots + S[p_n], |s| = n, 0 \le p_1 \le p_2 \le \cdots \le p_n \le |S|
s=S[p1]+S[p2]+⋯+S[pn],∣s∣=n,0≤p1≤p2≤⋯≤pn≤∣S∣
前缀和后缀
字符串
S
S
S 的前缀
p
p
p 是一段特殊的子串,满足
p
[
0
]
=
S
[
0
]
p[0] = S[0]
p[0]=S[0] 且
∣
p
∣
≤
∣
S
∣
|p| \le |S|
∣p∣≤∣S∣。记作
p
⊏
S
p \sqsubset S
p⊏S。
字符串
S
S
S 的后缀
s
s
s 是一段特殊的子串,满足
s
[
∣
s
∣
−
1
]
=
S
[
∣
S
∣
−
1
]
s[|s| - 1] = S[|S| - 1]
s[∣s∣−1]=S[∣S∣−1] 且
∣
s
∣
≤
∣
S
∣
|s| \le |S|
∣s∣≤∣S∣,记作
s
⊐
S
s \sqsupset S
s⊐S。
后缀重叠定理
对于字符串 x , y , z x, y, z x,y,z 满足 x ⊐ z x \sqsupset z x⊐z 且 y ⊐ z y \sqsupset z y⊐z,若 ∣ x ∣ = ∣ y ∣ |x| = |y| ∣x∣=∣y∣,则 x = y x = y x=y;若 ∣ x ∣ < ∣ y ∣ |x| < |y| ∣x∣<∣y∣,则 x ⊐ y x \sqsupset y x⊐y;若 ∣ x ∣ > y |x| > y ∣x∣>y,则 y ⊐ x y \sqsupset x y⊐x。
字典序
依次比较第 i i i 个字符进行大小比较所得到的编号(?)。特别规定,空字符小于所有字符。
回文
回文是一种特殊的字符串,满足:
∀
i
∈
[
0
,
∣
S
∣
−
1
]
,
S
[
i
]
=
S
[
∣
S
∣
−
1
−
i
]
\forall i \in [0, |S| - 1], S[i] = S[|S| - 1 - i]
∀i∈[0,∣S∣−1],S[i]=S[∣S∣−1−i]
字符串存储
char c[]
类似(C 风格)使用scanf("%s\n",s+1);
读入。std::string c
类似(C++ STL 风格)使用std::cin>>c;
读入。- 字符串常量可以使用字符串字面量(用双引号括起来
""
)表示,如"abababc"
。