AOAPC(算法競賽入門經典)Volume 1 字符串章節共 9 道題,涵蓋回文/鏡像判斷、矩陣字符串搜索、模式替換、敏感詞統計、編碼解碼、單詞提取排序、前綴碼判斷、自動編輯等核心技能。本文提供統一風格的題意提煉、算法思路、關鍵代碼與避坑指南。
任務:判斷字符串是普通回文、鏡像字符串、鏡像回文、還是都不是。鏡像映射表固定(如 A↔A, 3↔E, 2↔S, 5↔Z, 8↔8...)。
關鍵點:
char mirror[256] 查表 O(1) 判斷鏡像字符s[i]==s[j])與鏡像(s[i]==mirror[s[j]])任務:在 m×n 字符矩陣中尋找 k 個查詢詞,允許 8 方向(橫豎斜),大小寫不敏感,輸出首次出現的 1-based 座標。
優化技巧:
dx[8]={-1,-1,-1,0,0,1,1,1}, dy[8]={-1,0,1,-1,1,-1,0,1}0 <= x+len*dx < m任務:輸入兩行,第一行含兩對 <...>,第二行以 ... 結尾。輸出:第一行去標記;第二行將 ... 替換為 <第三段><第二段><第一段><第四段>。
核心邏輯:
p1< p2> p3< p4> p5. 五個關鍵位置s1=p1+1..p2-1, s2=p2+1..p3-1, s3=p3+1..p4-1, s4=p4+1..ends1 s2 s3 s4(去標記)s3 s2 s1 s4 替換 ...任務:給定 P、U、I 中任意兩個(含單位 m/k/M),求第三個。公式 P=U*I。
解析關鍵:
= 定位數值,解析浮點數(含小數點)m=1e-3, k=1e3, M=1e6P=U*I, U=P/I, I=P/UProblem #n\nX=%.2fUnit\n,單位固定(W/V/A)任務:給 m 個敏感詞、n 個句子,找出包含敏感詞最多的句子(大小寫不敏感,全詞匹配,重複計數)。
關鍵難點:
strstr 循環查找,檢查前後字符任務:輸入多行,每行 10 字符(_、o、.),o=1, _=0,忽略 .,按位權 128,64,8,4,2,1(注意順序)解碼為 ASCII 字符。以全 _ 行結束(兩行)。
簡潔實現:
while (gets(line)) {
if (line[0]=='_' && ...) break;
int val = 0, bit = 128;
for (int i=1; i<9; ++i) { // 只看 8 個有效位
if (line[i]=='o') val += bit;
bit >>= 1;
}
putchar(val);
}
任務:讀取所有輸入行,提取單詞(連續字母,大小寫不敏感),轉小寫,去重,字典序輸出。
工程實現:
strtok 分割單詞存入 vectorsort + unique 或 set 去重排序任務:每組最多 10 個二進制碼字,判斷是否存在一個是另一個的前綴(即非即時可解碼)。以 9 結束組,EOF 結束。
暴力可行:n≤10,兩兩 strncmp 比較長度較短者即可。或構建 Trie 樹插入檢查(練手用)。
任務:給 t 組替換規則 (from, to),對目標串依次應用每條規則:從左到右找到所有非重疊匹配並替換,規則間順序執行。
實現要點:
find 並 replace,注意替換後位置後移 to.length()strstr + 內存移動(memmove)擴縮字符串gets/getline 讀整行,scanf 後記得 getchar() 吃掉換行tolower 處理string 或預分配緩衝區,避免 O(n²) 拷貝這 9 題橫跨字符串處理的查找、匹配、替換、編碼、排序、統計全谱系。掌握它們,意味著你已具備了解決 80% 以上 ACM 字符串題的核心工具箱。建議:手寫一遍每道題的核心函數,體會指針/迭代器邊界、內存移動、狀態機設計的細微差別——這才是從「會做」到「精通」的分水嶺。