目录
1. 问题定义
在模式匹配问题中,给定长度为 n 的文本字符串 T 和 长度为 m 的模式字符串 P,需要确定 P 是否是 T 的一个子串。如果是,则找到 P 在 T 中的开始位置的索引,或者从 T 中找到所有 P 的开始位置的索引。
2. Brute Force 算法
Brute Force 就是穷举 P 相对于 T 产生的所有可能性。
Brute Force 由两个嵌套的循环组成,一个是在文本字符串所有可能的开始位置进行外部循环索引,另一个是在模式字符串的每个字符之间进行内部循环索引,并依次将每个字符与文本字符串中对应的字符进行比较。
Brute Force 在最坏的情况下,外部循环执行 n - m + 1 次,内部循环执行 m 次,最坏的运行时间是 O(mn)。
3. 图解 Brute Force
P = "hello world"
T = "world"
4. 代码实现
4.1. Python
def brute_force(text, pattern):
n, m = len(text), len(pattern)
for i in range(n - m + 1):
k = 0
while k < m and text[i + k] == pattern[k]:
k += 1
if k == m:
return i
return -1
def main():
text = "hello world"
pattern1 = "world"
print(brute_force(text, pattern1))
pattern2 = "python"
print(brute_force(text, pattern2))
if __name__ == "__main__":
main()
4.2. Java
package org.example;
public class BruteForce {
public static int bruteForce(String text, String pattern) {
int n = text.length();
int m = pattern.length();
for (int i = 0; i < n; i++) {
int k = 0;
while (k < m && text.charAt(i + k) == pattern.charAt(k)) {
k++;
}
if (k == m) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
String text = "hello world";
String pattern1 = "world";
System.out.println(bruteForce(text, pattern1));
String pattern2 = "python";
System.out.println(bruteForce(text, pattern2));
}
}
4.3. C
#include <stdio.h>
#include <string.h>
int bruteForce(const char *text, const char *pattern) {
int n = strlen(text);
int m = strlen(pattern);
for (int i = 0; i < n; i++) {
int k = 0;
while (k < m && text[i + k] == pattern[k]) {
k++;
}
if (k == m) {
return i;
}
}
return -1;
}
int main() {
char text[] = "hello world";
char pattern1[]= "world";
printf("%d\n", bruteForce(text, pattern1));
char pattern2[] = "python";
printf("%d\n", bruteForce(text, pattern2));
}
4.4. C++
#include <iostream>
#include <string>
using namespace std;
int bruteForce(string text, string pattern) {
int n = text.size();
int m = pattern.size();
for (int i = 0; i < n; i++) {
int k = 0;
while (k < m && text[i + k] == pattern[k]) {
k++;
}
if (k == m) {
return i;
}
}
return -1;
}
int main() {
string text = "hello world";
string pattern1 = "world";
cout << bruteForce(text, pattern1) << endl;
string pattern2 = "python";
cout << bruteForce(text, pattern2) << endl;
}