int i = 0, j = 0;
while ((i <= (int)strlen(str) / 2) && (j == 0)) {
if (*(str + i) == *(str + (strlen(str) - i) - 1)) {
i++;
} else {
j = 1;
}
}
return j == 0 ? 1 : 0;
i 從左向右(索引 0,1,2...),strlen(str) - i - 1 從右向左(索引 len-1, len-2...)。i <= len/2 只需比較前半段;j==0 作為標誌位,一旦發現不等即置 1 退出。*(str + i) 等價 str[i](左側字符)。*(str + (strlen(str) - i) - 1) 等價 str[len - i - 1](右側對應字符)。str="0123456789",len=10。i=0 比較 str[0]('0') 與 str[9]('9')。i=1 比較 str[1]('1') 與 str[8]('8')。以此類推。j==0 代表全程匹配(回文),返回 1;否則 0。// 1. 避免重複調用 strlen
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
if (str[i] != str[len - 1 - i]) return 0;
}
return 1;
// 2. 指針版本(更符合 C 風格)
char *left = str;
char *right = str + len - 1;
while (left < right) {
if (*left++ != *right--) return 0;
}
return 1;
| 版本 | 時間 | 空間 | 備註 |
|---|---|---|---|
| 原版 | O(n²) | O(1) | 每次循環調用 strlen 導致 O(n²) |
| 優化版 | O(n) | O(1) | 預存長度/雙指針 |
若字符串含中文(UTF-8 多字節),按字節比較會誤判。需解碼為代碼點數組(wchar_t/char32_t)或用 ICU 庫處理。
核心模式:**左右夾逼、預存長度、早退出**,是判斷回文/對稱結構的通用模板。