这里会显示出您选择的修订版和当前版本之间的差别。
|
2020-2021:teams:legal_string:字符串匹配_lgwza [2020/07/15 18:43] lgwza 创建 |
2020-2021:teams:legal_string:字符串匹配_lgwza [2020/07/15 18:44] (当前版本) lgwza |
||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | # 字符串匹配 | + | ====== 字符串匹配 ====== |
| + | ===== 字符串匹配问题 ===== | ||
| - | + | ==== 单串匹配 ==== | |
| - | ## 字符串匹配问题 | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | ### 单串匹配 | + | |
| 一个模式串(pattern),一个待匹配串,找出前者在后者中的所有出现位置。 | 一个模式串(pattern),一个待匹配串,找出前者在后者中的所有出现位置。 | ||
| - | + | ==== 多串匹配 ==== | |
| - | + | ||
| - | ### 多串匹配 | + | |
| 多个模式串,一个待匹配串(多个待匹配串可以直接连起来)。 | 多个模式串,一个待匹配串(多个待匹配串可以直接连起来)。 | ||
| 行 19: | 行 13: | ||
| 直接当作单串匹配肯定是可以的,但是效率不够高。 | 直接当作单串匹配肯定是可以的,但是效率不够高。 | ||
| + | ==== 匹配一个串的任意后缀 ==== | ||
| + | ==== 匹配多个串的任意后缀 ==== | ||
| - | ### 匹配一个串的任意后缀 | + | ===== 暴力做法 ===== |
| - | + | ||
| - | + | ||
| - | + | ||
| - | ### 匹配多个串的任意后缀 | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | ## 暴力做法 | + | |
| 对于每个位置,尝试对模式串和待匹配串进行比对。 | 对于每个位置,尝试对模式串和待匹配串进行比对。 | ||
| 行 37: | 行 25: | ||
| (伪代码) | (伪代码) | ||
| - | ```c++ | + | <code cpp> |
| std::vector<int> match(char *a, char *b, int n, int m) { | std::vector<int> match(char *a, char *b, int n, int m) { | ||
| std::vector<int> ans; | std::vector<int> ans; | ||
| 行 48: | 行 36: | ||
| return ans; | return ans; | ||
| } | } | ||
| - | ``` | + | </code> |
| 时间复杂度分析: | 时间复杂度分析: | ||
| 行 58: | 行 45: | ||
| 如果字符集的大小大于 1 (有至少两个不同的字符),平均时间复杂度是 $O(n)$ 的。但是在 OI 题目中,给出的字符串一般都不是纯随机的。 | 如果字符集的大小大于 1 (有至少两个不同的字符),平均时间复杂度是 $O(n)$ 的。但是在 OI 题目中,给出的字符串一般都不是纯随机的。 | ||
| + | ===== Hash 的方法 ===== | ||
| + | ===== KMP 算法 ===== | ||
| - | ## Hash 的方法 | + | ===== 参考链接 ===== |
| - | + | ||
| - | + | ||
| - | + | ||
| - | ## KMP 算法 | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | ## 参考链接 | + | |
| - | [Oi Wiki](https://oi-wiki.org/string/match/) | + | [[https://oi-wiki.org/string/match/|Oi Wiki]] |