首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

藍橋杯 FJ 字符串問題:遞歸與迭代優化方案

     編輯:程式設計綜合問答

題目規律

字串序列定義:

A1 = "A"
A2 = "ABA"
A3 = "ABACABA"
A4 = "ABACABADABACABA"
...
An = A(n-1) + char('A'+n-1) + A(n-1)

輸入 N (≤26),輸出 AN。N=20 時長度約 100 萬,N=26 時長度達 6700 萬,記憶體與時間壓力極大。

原始遞歸代碼缺陷

  • 使用巨大靜態陣列 char ch[1500000],棧溢位風險。
  • 遞歸深度 N=26 導致棧幀過多,效率低。
  • 字串拼接重複複製,時間複雜度 O(2^N)。

優化方案一:迭代構建(自底向上)

string s = "A";
for (int i = 2; i <= n; ++i) {
    s = s + char('A' + i - 1) + s;
}
cout << s << endl;
  • 使用 std::string 自動管理記憶體,避免手動陣列。
  • 但 N=26 時字串長度 67M,拼接仍會產生大量臨時物件,需預留容量:s.reserve((1<。

優化方案二:輸出流式生成(不存儲完整字串)

利用遞歸結構直接向標準輸出寫入,避免記憶體爆炸:

void printA(int n) {
    if (n == 1) { cout << 'A'; return; }
    printA(n-1);
    cout << char('A' + n - 1);
    printA(n-1);
}
  • 時間複雜度 O(2^N),但空間複雜度僅 O(N) 遞歸棧。
  • N=26 時輸出 67M 字符,IO 成主導瓶頸,建議用 ostringstream 或分塊 fwrite 加速。

進階技巧:位運算直接求第 K 字符

AN 中第 K 個字符(1-indexed)等於 'A' + __builtin_ctz(K)(K 的最低有效位位置)。可 O(1) 回答查詢,無需生成整串。

總結

  • 小 N (≤20):迭代 std::string 即可。
  • 大 N (≤26):流式遞歸輸出或位運算查詢。
  • 避免棧上大陣列,善用 reserve、移動語義、輸出緩衝。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved