Rabin-Karp字符串搜索算法是一种基于哈希的字符串匹配算法,用于在一个文本中查找一个模式字符串的出现。使用哈希函数来计算模式字符串和文本中的子串的哈希值,并比较它们的哈希值来确定是否匹配。如果哈希值匹配,则进一步比较实际字符串以确认匹配。算法通过滑动窗口的方式在文本中移动,以便在每个位置上计算新的子串的哈希值。
Rabin-Karp算法用于解决在一个文本中查找一个模式字符串的出现。它可以用于字符串匹配、文本搜索、数据压缩等问题。
- public class RabinKarp {
- private static final int PRIME = 31; // 选择一个质数作为哈希函数的基数
-
- public static int search(String text, String pattern) {
- int n = text.length();
- int m = pattern.length();
- int patternHash = calculateHash(pattern, m); // 计算模式字符串的哈希值
- int textHash = calculateHash(text, m); // 计算文本中第一个子串的哈希值
-
- for (int i = 0; i <= n - m; i++) {
- if (patternHash == textHash && isMatch(text, pattern, i)) {
- return i; // 找到匹配的位置
- }
-
- if (i < n - m) {
- textHash = recalculateHash(text, i, i + m, textHash, m); // 计算下一个子串的哈希值
- }
- }
-
- return -1; // 未找到匹配的位置
- }
-
- private static int calculateHash(String str, int length) {
- int hash = 0;
-
- for (int i = 0; i < length; i++) {
- hash += str.charAt(i) * Math.pow(PRIME, i);
- }
-
- return hash;
- }
-
- private static int recalculateHash(String str, int oldIndex, int newIndex, int oldHash, int patternLength) {
- int newHash = oldHash - str.charAt(oldIndex);
- newHash /= PRIME;
- newHash += str.charAt(newIndex) * Math.pow(PRIME, patternLength - 1);
- return newHash;
- }
-
- private static boolean isMatch(String text, String pattern, int startIndex) {
- for (int i = 0; i < pattern.length(); i++) {
- if (text.charAt(startIndex + i) != pattern.charAt(i)) {
- return false;
- }
- }
-
- return true;
- }
-
- public static void main(String[] args) {
- String text = "ABCABCDABABCDABCDABDE";
- String pattern = "ABCDABD";
-
- int index = search(text, pattern);
-
- if (index != -1) {
- System.out.println("在位置 " + index + " 找到匹配");
- } else {
- System.out.println("未找到匹配");
- }
- }
- }