C++ 中字符串的子串与索引不一致

Substring of string in C++ do not coincide with index

当我尝试解决 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;    
}

输出如下

这很奇怪,为什么子字符串的长度与索引的范围不一致。

我建议 运行 在调试器中编写代码并在开始和结束时设置监视。很有可能,这并没有按照您认为的方式工作。

回顾一下 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() 的假设不正确,请执行以下操作:

  1. 按照我的建议设置调试器。
  2. 尝试更复杂的测试以更深入地了解问题。

注意:将来,请尝试更好地记录您的代码,特别是如果您要在 help/solutions 的在线论坛上发帖。