C++代码出现运行时错误无输出,求排查最长无重复字符子串解法
解决最长无重复字符子串的运行时错误问题
老兄,我太懂你碰到这种运行时错误+无输出的糟心情况了——明明逻辑想的没问题,程序却直接崩掉连个报错都不给。咱们先从你提到的notin辅助函数和常见坑点说起,再给你捋捋正确的实现思路。
先排查可能导致崩溃的常见原因
你提到写了notin函数检查字符是否在子串中,这大概率是第一个踩坑点:
- 最常见的是字符串索引越界:比如遍历子串时,循环条件写成了
i <= s.size()而不是i < s.size(),直接访问了字符串末尾之后的内存,触发运行时错误,程序直接崩溃,自然没输出。 - 其次是维护当前子串时的逻辑错误:比如拼接子串时没有正确控制起始/结束位置,或者变量初始化错误(比如最大长度初始值设成负数,导致后续更新逻辑混乱)。
推荐的高效实现:滑动窗口法
暴力遍历所有子串的方法(比如你用notin逐个检查)不仅效率低(时间复杂度O(n²)),还容易踩各种边界坑。这里给你用滑动窗口+哈希表的最优解法,时间复杂度O(n),还能避免很多错误:
#include <iostream> #include <string> #include <unordered_map> using namespace std; int lengthOfLongestSubstring(string s) { unordered_map<char, int> charIndex; // 记录每个字符最后出现的索引 int maxLen = 0; int left = 0; // 滑动窗口左边界 for (int right = 0; right < s.size(); right++) { // 如果当前字符已经在窗口内出现过,更新左边界到重复字符的下一位 if (charIndex.find(s[right]) != charIndex.end() && charIndex[s[right]] >= left) { left = charIndex[s[right]] + 1; } // 更新当前字符的最新索引 charIndex[s[right]] = right; // 计算当前窗口长度,更新最大长度 maxLen = max(maxLen, right - left + 1); } return maxLen; } int main() { // 测试示例 cout << lengthOfLongestSubstring("abcabcbb") << endl; // 输出3 cout << lengthOfLongestSubstring("bbbbb") << endl; // 输出1 cout << lengthOfLongestSubstring("pwwkew") << endl; // 输出3 return 0; }
代码解释
- 用
unordered_map记录每个字符最近一次出现的位置,这样不用每次遍历子串检查重复,直接O(1)查询。 left和right分别代表滑动窗口的左右边界,窗口内就是当前无重复的子串。- 每次移动
right时,若发现当前字符已在窗口内,就把left移到重复字符的下一位,保证窗口内始终无重复。
如果你坚持用暴力法(修正notin函数)
要是你想先把自己的暴力写法改对,那先把notin函数的越界问题修好:
bool notin(char x, const string& s) { for (int i = 0; i < s.size(); i++) { // 注意是i < s.size(),不是<= if (s[i] == x) { return false; } } return true; }
然后主函数里的逻辑也要注意边界:比如遍历每个起始位置,然后逐个往后加字符,直到遇到重复的,记录长度。但这种方法对于长字符串(比如10000+字符)会超时,所以还是更推荐滑动窗口法。
最后提醒
运行时错误无输出,大概率是内存访问越界或者空指针问题,你可以用调试工具(比如GDB)断点调试,看看程序崩溃在哪一行,就能快速定位问题啦。
内容的提问来源于stack exchange,提问作者blastoise
相关产品推荐
相关产品推荐

