You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于栈的C++ Stretch函数实现异常:输出不符求排查

问题分析与修正方案

核心逻辑错误

你当前的代码完全没有实现生成所有扩展组合的逻辑,只是将每个字符重复k次后插入链表,再加上如果insert是头插法,会导致输出顺序反转,最终得到cc bb aa的结果,和预期的组合生成需求完全不符。另外,你提到要基于栈实现,但当前代码既没有栈的逻辑,也未正确实现链表的insert方法(代码中List类未定义该成员函数)。

正确实现思路(基于栈)

要生成所有可能的扩展字符串,本质是对每个字符做「重复1次」或「重复k次」的选择(k=2时对应两种选项),用栈可以实现深度优先遍历,逐个处理字符生成所有组合:

  1. 初始化栈,将空字符串压入作为起始状态。
  2. 遍历输入字符串的每个字符:
    • 取出栈中所有现有字符串,分别生成两个新字符串:原字符串追加1次当前字符、原字符串追加k次当前字符。
    • 将新生成的字符串重新压入栈。
  3. 遍历完成后,栈中所有元素即为所有扩展后的字符串。

修正后的代码

#include <iostream>
#include <stack>
#include <vector>
#include <string>

using namespace std;

vector<string> stretch(string input_str, int k) {
    stack<string> s;
    s.push(""); // 初始空字符串

    for (char c : input_str) {
        int stack_size = s.size();
        // 处理当前栈中所有现有字符串
        for (int i = 0; i < stack_size; ++i) {
            string curr = s.top();
            s.pop();

            // 生成两种扩展情况
            s.push(curr + c); // 追加1次当前字符
            string repeated(k, c);
            s.push(curr + repeated); // 追加k次当前字符
        }
    }

    // 栈是后进先出,反转后得到预期顺序
    vector<string> result;
    while (!s.empty()) {
        result.insert(result.begin(), s.top());
        s.pop();
    }
    return result;
}

int main() {
    vector<string> result = stretch("abc", 2);
    cout << "Stretch: ";
    for (size_t i = 0; i < result.size(); ++i) {
        if (i > 0) cout << ", ";
        cout << result[i];
    }
    cout << endl;
    return 0;
}

代码说明

  • 用栈逐步生成所有组合,每个字符处理时覆盖所有可能的扩展方式,确保生成2^n种结果(n为输入字符串长度)。
  • 最后反转栈元素转为vector,修正栈后进先出导致的顺序问题,输出结果与预期完全一致:abc, aabc, abbc, aabbc, abcc, aabcc, abbcc, aabbcc。

内容的提问来源于stack exchange,提问作者beginnerprogrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:25:28