当我尝试从leetcode解决问题Longest Palindromic Substring时,发生了一些奇怪的事情,我无法理解问题所在。这是我写的源代码,也有奇怪的输出。
#include <iostream>
#include <string>
class Solution {
public:
std::string longestPalindrome(std::string s) {
// incase s is empty
if (s.size() < 1) return "";
int start = 0, end = 0;
for (std::string::size_type i = 0; i < s.size(); i++) {
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i+1);
int len = std::max(len1, len2);
if (len > (end - start + 1)) {
start = i - (len-1)/2;
end = i + (len) /2;
}
}
std::cout << std::endl;
std::cout << "start: " << start << ", end: " << end << std::endl;
return s.substr(start, end+1);
}
private:
int expandAroundCenter(std::string s, int left, int right)
{
while (left >= 0 && right < s.size() && s[left] == s[right])
{
left--;
right++;
}
return right-left-1;
}
};
int main(void)
{
std::string s1 = "ababd";
std::string s2 = "addbbcc";
std::string s3 = "bb";
Solution sol;
std::cout << sol.longestPalindrome(s1) << std::endl;
std::cout << sol.longestPalindrome(s2) << std::endl;
std::cout << sol.longestPalindrome(s3) << std::endl;
std::cout << std::endl;
return 0;
}
输出如下
这就是为什么子字符串的长度与索引范围不一致的原因。
答案 0 :(得分:1)
我建议在调试器中运行代码,并在开始和结束时设置监视。很有可能,这与您认为的方式不符。
调用string :: substr()的定义
string substr (size_t pos = 0, size_t len = npos) const;
'pos' = start position of the substring
'len' = Number of characters to include in the substring
在我看来,您可能会认为string :: substr()通过指定开始和结束位置而起作用,但事实并非如此。
我希望这会有所帮助。如果我对string :: substr()的假设不正确,请执行以下操作:
注意:将来,请尝试更好地记录代码,特别是如果您要在在线论坛上发布有关帮助/解决方案的情况。