首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ACM 審查敏感詞遞歸刪除:KMP/堆疊單次掃描 O(n)

     編輯:程式設計綜合問答

題目:給敏感詞 `w`、長文本 `p`,反覆尋找 `w` 在 `p` 中**第一次出現**並刪除,直到無 `w` 為止。長度至 5×10⁶。

關鍵理解

「第一次出現」指**最左邊**最早出現的位置。刪除後左右兩部分拼接,**新邊界可能形成新的 `w`** 需繼續刪除(如樣例 `abc` + `aaabcbc` → 刪中間 `abc` → `aabc` → 刪 `abc` → `a`)。

高效演算法:堆疊 + KMP 狀態

  1. 預計算 `w` 的 KMP `next` 陣列(失敗函數)。
  2. 掃描 `p` 每字元 `c`,壓入堆疊,同時維護當前匹配長度 `j`:
    
    while (j > 0 && c != w[j]) j = next[j-1];
    if (c == w[j]) j++;
    stack.push({c, j});
    if (j == m) { // 匹配到 w
        pop m elements; // 刪除
        j = stack.empty() ? 0 : stack.top().matched_len; // 回溯狀態
    }
    
  3. 最終堆疊內字元即結果。時間 O(|p|),空間 O(|p|)。

樣例驗證:`w=abc, p=aaabcbc` → 堆疊流程正確產出 `a`。

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