【算法设计与分析作业题】第四周:5. Longest Palindromic Substring

题目

C++ solution

class Solution {
public:
    string longestPalindrome(string s) {
        int len = s.size(); // 字符串s的长度
        if (len < 1)
        {
        	return "";
        }

        int start = 0, maxlen = 0; // 记录子字符串的首字符在原字符串中的下标和回文子串的最大长度

        // 遍历每个回文子串的中心点,中心有两种情况,一是单个字符,二是两个相同且相邻的字符
        for (int i = 0; i < len; i++)
        {
        	int len1 = lenWithGivenCenter(s, len, i, i);
        	int len2 = lenWithGivenCenter(s, len, i, i+1);
        	int longlen = len1 > len2 ? len1 : len2;

        	if (longlen > maxlen)
        	{
                maxlen = longlen;
        		start = i - (maxlen - 1) / 2;   		
        	}
        }
        
        return s.substr(start, maxlen);
    }

    /*
     * 计算由给定中心所得到的最长回文的长度
     */
    int lenWithGivenCenter(string s, int len, int left, int right)
    {
    	while(left >= 0 && right < len && s[left] == s[right])
    	{
    		left--;
    		right++;
    	}
    	return right - left - 1;
    }
};

简要题解

回文串是指正反读都一样的字符串,即该字符串是对称的。所以回文串必有一个中心点,中心点有两种情况,一是单个字符,二是两个相同且相邻的字符。遍历给定字符串的所有可能中心点,计算每个中心点所得到的最长回文的长度,比较得到最长的回文子串。

猜你喜欢

转载自blog.csdn.net/For_course/article/details/82914083