oi-wiki
Version:
wiki for OI / ACM-ICPC
53 lines (32 loc) • 1.05 kB
Markdown
## 字符串匹配问题
字符串匹配问题分为好多类:
### 单串匹配
一个模式串 (pattern),一个待匹配串,找出前者在后者中的所有出现位置
### 多串匹配
多个模式串,一个待匹配串(多个待匹配串还用说,直接连起来)
直接当做单串匹配肯定是可以的,但是效率不够高
### 匹配一个串的任意后缀
### 匹配多个串的任意后缀
## 暴力做法
对于每个位置,尝试对模式串和待匹配串进行比对
(伪代码)
```text
match(char *a, char *b, int n, int m) {
ans = new vector();
for (i = 0; i < n - m + 1; i++) {
for (j = 0; j < m; j++) {
if (a[i + j] != b[j]) break;
}
if (j == m) ans.push_back(i);
}
return ans;
}
```
时间复杂度分析:
最坏时间复杂度是 $O(nm)$ 的,
最好是 $O(n)$ 的。
如果字符集的大小大于 1 (有至少两个不同的字符),平均时间复杂度是 $O(n)$ 的。
## Hash 的方法
参见 [Hash](/string/hash)
## KMP 算法
参见 [KMP](/string/kmp)