for(int i = 0; i < strlen(charSet); i++)
hash[charSet[i]] = 1;
這兩行代碼的作用是:**構建一個「待刪除字符查找表」**。
hash 是一個長度 256 的整型數組,下標對應 ASCII 碼值(0-255)輸入: 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;
}
若需支持 Unicode,哈希表需改用 `std::unordered_set