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

C語言字符刪除函數解析:哈希表標記法高效過濾指定字符

     編輯:程式設計綜合問答

代碼片段

for(int i = 0; i < strlen(charSet); i++)
    hash[charSet[i]] = 1;

詳細解析

這兩行代碼的作用是:**構建一個「待刪除字符查找表」**。

  1. hash 是一個長度 256 的整型數組,下標對應 ASCII 碼值(0-255)
  2. 遍歷 `charSet`(要刪除的字符集合),將每個字符的 ASCII 碼對應的 `hash` 值置為 1
  3. 後續遍歷目標字符串 `str` 時,只需檢查 `hash[str[i]]` 是否為 1,即可 O(1) 判斷該字符是否應刪除

完整流程圖解

輸入: str = "abacad", charSet = "ac"

步驟1: 初始化 hash[256] = {0}

步驟2: 標記待刪除字符
  charSet[0] = 'a' (ASCII 97) → hash[97] = 1
  charSet[1] = 'c' (ASCII 99) → hash[99] = 1

步驟3: 過濾 str
  i=0: 'a' → hash[97]==1 → 刪除
  i=1: 'b' → hash[98]==0 → 保留 → str[0]='b'
  i=2: 'a' → 刪除
  i=3: 'c' → 刪除
  i=4: 'a' → 刪除
  i=5: 'd' → 保留 → str[1]='d'
  
結果: str = "bd"

完整函數代碼

char* deleteCharacters(char *str, char *charSet) {
    if (!charSet) return str;
    
    int hash[256] = {0}; // 棧上分配,自動歸零
    
    // 標記階段
    for (int i = 0; charSet[i]; i++) {
        hash[(unsigned char)charSet[i]] = 1;
    }
    
    // 過濾階段(雙指針原地修改)
    int write = 0;
    for (int read = 0; str[read]; read++) {
        if (!hash[(unsigned char)str[read]]) {
            str[write++] = str[read];
        }
    }
    str[write] = '\0'; // 截斷尾部
    return str;
}

優化要點

  • 使用 `(unsigned char)` 強轉避免負索引(char 有符號時)
  • 預計算 `strlen(charSet)` 避免循環中重複調用
  • 雙指針原地修改,空間 O(1),時間 O(n+m)
  • 若字符集固定(如只刪除數字),可改用 `isdigit()` 等標準庫函數

擴展:Unicode 支持

若需支持 Unicode,哈希表需改用 `std::unordered_set` (C++) 或 `HashSet` (Java),原理相同。

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