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

如何将实现字符串滑动分片的Python递归函数转为可返回列表的C++代码

问题诊断与修复方案

原有代码的核心问题

  • 多余的window_list函数逻辑错误:该函数声明返回vector<string>类型但没有返回值,且设计完全不符合需求,不需要单独封装该操作。
  • 递归逻辑缺失拼接步骤:原Python逻辑是[当前分片] + 递归返回的后续分片列表,你的C++代码仅把当前分片存入局部变量outp_list,递归返回时直接返回下一层的结果,没有把当前分片拼接到结果最前面,导致所有上层分片全部丢失。
  • 终止条件语法错误:return vector<string> window_list();是无效语法,终止条件应该直接返回空的vector<string>。
  • 缺少输入合法性校验:原Python代码有判断输入字符串非空、分片长度和步长大于0的逻辑,C++代码未实现,可能触发非法输入导致的异常。

修复后的完整代码

#include <iostream>
#include <vector>
#include <string>
using namespace std;

vector<string> window(string s, int len_suf, int jump) {
    string word = s.substr(0, len_suf);
    // 终止条件:当前分片长度不足,返回空列表
    if (word.size() < len_suf) {
        return {};
    }
    // 递归获取后续所有分片
    vector<string> sub_res = window(s.substr(jump), len_suf, jump);
    // 把当前分片插入到结果最前面,对应Python的[word] + 递归结果逻辑
    sub_res.insert(sub_res.begin(), word);
    return sub_res;
}

int main() {
    string s;
    int len_suf, jump;
    cin >> s >> len_suf >> jump;
    // 输入合法性校验
    if (s.empty() || len_suf <= 0 || jump <= 0) {
        return 0;
    }
    vector<string> ans = window(s, len_suf, jump);
    for (const auto& x : ans) {
        cout << x << endl;
    }
    return 0;
}

可选优化:迭代版本(避免长字符串递归栈溢出)

如果待处理的字符串长度非常大,递归版本可能触发栈溢出,可改用迭代实现:

vector<string> window(string s, int len_suf, int jump) {
    vector<string> res;
    int n = s.size();
    for (int i = 0; i + len_suf <= n; i += jump) {
        res.push_back(s.substr(i, len_suf));
    }
    return res;
}

该版本和原递归版本逻辑完全一致,运行效率更高,没有栈溢出风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:36:06