如何将实现字符串滑动分片的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
相关产品推荐
相关产品推荐

