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

时间:2018-08-03 02:36:15

标签: c++ palindrome

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

输出如下

output

这就是为什么子字符串的长度与索引范围不一致的原因。

1 个答案:

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

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

注意:将来,请尝试更好地记录代码,特别是如果您要在在线论坛上发布有关帮助/解决方案的情况。