← 中文资源

简体中文版本

Rabin-Karp 滚动哈希匹配

用滚动哈希在文本中查找模式所有出现位置。

阅读英文原文

功能说明

Rabin-Karp 滚动哈希匹配是一个面向data-fetching场景的typescript代码示例。用滚动哈希在文本中查找模式所有出现位置。该示例展示了如何在实际项目中运用这一技术,代码结构清晰,便于理解和复用。

关键实现

该示例使用typescript语言实现,核心逻辑封装在函数中。代码遵循语言惯用风格,处理了边界情况,并考虑了性能与可读性的平衡。tags 标签包括:rabin-karp、rolling-hash、string-match,方便在平台上检索同类示例。

使用注意

使用本示例时需要注意输入约束和边界条件。该示例为代码片段(isSnippet),可直接嵌入到项目中使用。建议在实际应用前,根据业务需求调整参数和错误处理* 建议在实际应用前,根据业务需求调整参数和错误处理策略。relatedExamples 中列出了相关的其他示例,可供参考学习。

验证方式

可通过编写单元测试验证该示例的正确性。测试应覆盖正常输入、边界值和异常情况。确保在目标运行环境中测试代码的兼容性和性能表现。updatedDate 为 2026-10-25,已通过审核并发布。

代码示例

function rabinKarp(text: string, pattern: string): number[] {
  const base = 256, mod = 101;
  const n = text.length, m = pattern.length;
  if (m === 0 || m > n) return [];
  let patHash = 0, txtHash = 0, h = 1;
  for (let i = 0; i < m - 1; i++) h = (h * base) % mod;
  for (let i = 0; i < m; i++) { patHash = (patHash * base + pattern.charCodeAt(i)) % mod; txtHash = (txtHash * base + text.charCodeAt(i)) % mod; }
  const result: number[] = [];
  for (let i = 0; i <= n - m; i++) {
    if (patHash === txtHash && text.slice(i, i + m) === pattern) result.push(i);
    if (i < n - m) { txtHash = (base * (txtHash - text.charCodeAt(i) * h) + text.charCodeAt(i + m)) % mod; if (txtHash < 0) txtHash += mod; }
  }
  return result;
}