递归实现字符串按索引配对存入vector的逻辑错误排查
我需要实现一个返回vector<string>类型的函数,将两个字符串中同索引的字符配对组成新字符串并存入vector。例如输入strOne="shop"、strTwo="fast"时,vector应返回{"sf", "ha", "os", "pt"}。
我已编写如下重载递归函数,但逻辑存在错误,请求排查问题所在:
vector<string> function1(string strOne, string strTwo, int i) { string result; vector<string> strVec; if (strOne.size() == 0 && strTwo.size() == 0) { return strVec; } if (i == 0) { result = strOne.at(i) + strTwo.at(i); strVec.push_back(result); return strVec; } else { strVec = function1(strOne, strTwo, i- 1); result= strOne.at(i) + strTwo.at(i); strVec.push_back(result); return strVec; } } vector<string> function1(string strOne, string strTwo) { return function1(strOne, strTwo, strOne.size() - 1); }
我的实现思路:编写带int参数i的重载函数进行递归,以i==0为基例,通过递归逐步将配对后的字符串存入vector;无参数的重载函数调用带参数的函数,传入strOne.size()-1作为初始i值。但运行结果不符合预期,请问逻辑错误出在哪里?
错误分析及修正
1. 字符相加逻辑错误(核心问题)
当前代码中strOne.at(i) + strTwo.at(i)是将两个char类型的ASCII数值做算术相加,而非字符串拼接。例如's'(ASCII 115)和'f'(ASCII 102)相加得到217,赋值给string时会将该数值对应的ASCII字符转为字符串,最终得到的是单个奇怪字符,而非预期的两个字符拼接结果。
修正方法:将单个字符转为字符串后再拼接,两种可行方式:
// 方式1:用string构造函数转换后拼接 result = string(1, strOne.at(i)) + string(1, strTwo.at(i)); // 方式2:逐个添加字符到空字符串 result.clear(); result += strOne.at(i); result += strTwo.at(i);
2. 未处理字符串长度不一致的边界情况
代码默认两个输入字符串长度相同,但如果其中一个字符串更短,strOne.at(i)或strTwo.at(i)会触发越界异常。可以添加判断,只处理两个字符串都存在的索引:
if (i >= strOne.size() || i >= strTwo.size()) { return function1(strOne, strTwo, i - 1); }
3. 冗余且无效的空字符串判断
代码开头的if (strOne.size() == 0 && strTwo.size() == 0)几乎不会被触发:因为无参重载函数调用时,传入的i是strOne.size()-1,如果两个字符串都为空,i会是-1,直接进入else分支递归调用i=-2,最终触发at(i)的越界异常。建议替换为i < 0作为递归基例:
if (i < 0) { return strVec; }
修正后的完整代码示例:
#include <vector> #include <string> #include <algorithm> // 用于max函数 using namespace std; vector<string> function1(string strOne, string strTwo, int i) { string result; vector<string> strVec; if (i < 0) { return strVec; } // 处理长度不一致的情况,超出任一字符串长度则跳过当前索引 if (i >= strOne.size() || i >= strTwo.size()) { return function1(strOne, strTwo, i - 1); } // 先递归获取前面索引的配对结果 strVec = function1(strOne, strTwo, i - 1); // 正确拼接两个字符为字符串 result += strOne.at(i); result += strTwo.at(i); strVec.push_back(result); return strVec; } vector<string> function1(string strOne, string strTwo) { // 取两个字符串中较大的长度-1,确保所有有效索引都被处理 int maxLen = max(strOne.size(), strTwo.size()); return function1(strOne, strTwo, maxLen - 1); }
内容的提问来源于stack exchange,提问作者user21082127

