我写了下面的代码来检查文本是否是回文,我在leetcode上运行它,我得到了错误:
class Solution {
public:
bool isPalindrome(string s) {
int l=0,r=s.length()-1;
while(l<r)
{
while (!isalpha(s[r]))
{
--r;
}
while (!isalpha(s[l]))
{
++l;
}
if (tolower(s[r])!=tolower(s[l]))
return false;
--r;
++l;
}
return true;
}
};
字符串
第1061行:Char 9:运行时错误:将无符号偏移添加到0x 7 ffc 7 cc 10880溢出到0x 7 ffc 7 cc 1087 f(basic_string.h)摘要:未定义行为消毒剂:/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../include/c++/9/bits/basic_string.h:1070:9
我的代码有什么问题?
5条答案
按热度按时间b5buobof1#
你越界了
字符串
还有这里
型
r
可以变为负值,l
可以变为>= s.length()
。您应该添加一些检查,如
型
和/或
型
这一行同样的问题
型
这应该是
型
不同的方式(C++20)
一种不同的方法是使用以下命令从
s
中擦除所有非字母字符型
并删除内部的while循环。
6fe3ivhb2#
我认为你已经非常接近解决方案了。这里的陷阱是:
修复这类问题的简单方法是为每个迭代执行一个操作。你可以使用“else”来实现这一点。
字符串
yi0zb3m43#
一个类似的修改方法可以解决这个问题,只要遇到任何非字母数字字符,就继续循环。这里:
字符串
ttcibm8c4#
在某些情况下你会越界。所以你可以尝试下面的代码没有错误和内存泄漏。
字符串
polkgigr5#
正如其他人所说,你正在耗尽债券。下面是一个简化的解决方案,它不会耗尽债券,也没有if-then-else意大利面条代码:
字符串