給定長字符串 A 和短字符串 B,判斷 B 中每個字符是否都出現在 A 中。例:
A=ABCDEFGHLMNOPQRS, B=DCGSRQPOM → trueA=ABCDEFGHLMNOPQRS, B=DCGSRQPOZ → false (Z 不在 A 中)對 B 中每字符掃描 A。n=16, m=9 時 144 次比較。代碼簡單但不可取。
先對兩串排序,再雙指針線性掃描。隨長度增長優於暴力,但非最優。
// 快排 + 歸並式掃描
quicksort(A); quicksort(B);
i=j=0;
while (i<lenA && j<lenB) {
if (A[i] < B[j]) i++;
else if (A[i] == B[j]) { i++; j++; }
else break; // B[j] 不在 A 中
}
return j == lenB;
利用字符集有限(ASCII 256 或字母 52)建立查找表:
時間 O(n+m),空間 O(1)(固定 256 字節)。
bool containsAll(const string &A, const string &B) {
bool seen[256] = {false};
for (char c : A) seen[(unsigned char)c] = true;
for (char c : B) if (!seen[(unsigned char)c]) return false;
return true;
}
若僅含 a-z,一個 uint64_t 即可:
uint64_t mask = 0;
for (char c : A) mask |= 1ULL << (c - 'a');
for (char c : B) if (!(mask & (1ULL << (c - 'a')))) return false;
return true;
單指令位運算,極致高效。
本題核心在於識別「字符集有限」這一關鍵特性,從而將查找從 O(n) 降為 O(1)。位圖/哈希表是工程中處理「集合包含關係」的通用利器。