首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 回文判斷:從 STL 一行碼到指針雙向掃描

     編輯:關於C++

STL 极简实现

bool is_palindrome(const string& s) {
    return equal(s.begin(), s.end(), s.rbegin());
}

更高效(只比較前半段):

return equal(s.begin(), s.begin() + s.length()/2, s.rbegin());

C 風格指針版(教學/嵌入式適用)

bool is_palindrome(const char* s) {
    int len = strlen(s);
    for (int i = 0; i < len/2; ++i)
        if (s[i] != s[len-i-1]) return false;
    return true;
}

雙指針版(推薦:單遍歷、無需預計長度)

bool is_palindrome(const char* src) {
    assert(src != NULL);
    const char* end = src;
    while (*end) ++end;  // 移至結尾 '\0'
    --end;               // 指向最後一個有效字符

    while (src < end) {
        if (*src++ != *end--) return false;
    }
    return true;
}

遞歸版(學術展示)

bool is_palindrome_rec(const char* s, int len) {
    if (len <= 1) return true;
    if (s[0] != s[len-1]) return false;
    return is_palindrome_rec(s+1, len-2);
}

效能與適用場景比較

版本時間複雜度空間複雜度備註
STL equalO(n)O(1)現代 C++ 首選,可讀性最高
索引雙向O(n)O(1)需預計長度,適合隨機存取字串
雙指針O(n)O(1)單遍歷,適合 C 風格字串、流式處理
遞歸O(n)O(n)調用棧開銷大,僅供教學

擴展:Unicode / 多位元組字串處理

上述方法假設單位元素為 char。處理 UTF-8 需解碼為 code point 序列後再比較,建議使用 ICU 庫或 C++20 std::u8string 配合 std::ranges。

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