首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

NYOJ 327 親和串:KMP 算法判斷循環同構(s1+s1 包含 s2)

     編輯:C++ 入門

判斷 s2 是否為 s1 的循環移位子串。即:s1+s1 中是否包含 s2。KMP 算法 O(n+m) 求解。

KMP 核心

  • next[] 數組:模式串最長公共前後綴長度
  • 構建 next:next[0]=-1,匹配失敗時跳轉
  • 匹配:主串 s1+s1,模式串 s2

完整代碼

#include <cstdio>
#include <cstring>
#define maxn 100005
char str1[2*maxn], str2[maxn];
int next[maxn], len1, len2;

void getNext() {
    int i=0, j=-1; next[0]=-1;
    while (i

關鍵點

  1. 長度檢查:len1 < len2 直接 no
  2. memcpy 將 str1 複製到自身後方,構造 s1+s1
  3. KMP 模板可直接套用於所有字符串匹配問題

經典的「循環同構」判斷轉化為「字符串包含」問題,KMP 是線性時間解法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved