力扣题库--5. 最长回文子串

力扣题库--5. 最长回文子串_第1张图片

题目链接:

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:

输入: “cbbd”
输出: “bb”

中心扩散方法

从中心向两端寻找,最终得到最大的字符串
力扣题库--5. 最长回文子串_第2张图片

c++

class Solution {
public:
	
	/*返回比对成功个数*/
	inline int findMaxString(const string s, const int iLeft, const int iRight)
	{
		int iTmp = 0;
		int iLeftTmp = iLeft;
		int iRightTmp = iRight;
		
		while(iLeftTmp >= 0 &&
			  iRightTmp < s.length() && 
			  s[iLeftTmp] == s[iRightTmp])
		{
			iTmp++;
			iLeftTmp --;
			iRightTmp ++;
		}
		
		return iTmp;
	}
	
    string longestPalindrome(string s) {
        int iNum = 0;
		int iLeft = 0;
		int iRight = 0;
		int iTmp = 0;
		int iLenNum = 0;
		int iMaxlen = 0;
        
        if(s.empty() || 1 == s.length())
        {
            return s;
        }
        
		iMaxlen = 1;
		
        for (iNum = 0; iNum < s.length(); iNum++)  
        {
			/*尝试双数最大,如为回文,则长度为 2 * iTmp */
			iTmp = Solution::findMaxString(s, iNum, iNum+1);
			if( iTmp > 0 && 
				0 != (iLenNum = (iTmp + iTmp)) && 
				iLenNum > iMaxlen)
			{
				iLeft = iNum - (iTmp - 1);
				//iRight = iNum + 1 + (iTmp - 1);
				iMaxlen = iLenNum;
			}
			
			/*找单数最大,如为回文,则长度为 2 * iTmp + 1 */
			iTmp = Solution::findMaxString(s, iNum - 1, iNum + 1);
			if(	iTmp  && 
				0 != (iLenNum = (iTmp + iTmp + 1)) && 
				iLenNum > iMaxlen)
			{
				iLeft = iNum - iTmp;
				//iRight = iNum + iTmp;
				iMaxlen = iLenNum;
			}
        }
		
		return s.substr(iLeft,iMaxlen);
    }
};

执行结果
实际效果并不是很优秀。
力扣题库--5. 最长回文子串_第3张图片

参考一下优秀的

动态规划思想

class Solution {
public:

    string longestPalindrome(string s)
    {
        int left = 0;
        int right = 0;
        int nextPos = 0;
        int startPos = left;
        int maxLength = 1;
        int len = s.length();

        if (len == 1)
        {
            return s;
        }

        while (nextPos < len)
        {
            left = right = nextPos;
            while (right + 1 < len && s[right] == s[right + 1])
            {
                ++right;
            }

            nextPos = right + 1;

            while (left > 0 && right < len - 1 && s[left - 1] == s[right + 1])
            {
                --left;
                ++right;
            }

            if (right - left + 1 > maxLength)
            {
                startPos = left;
                maxLength = right - left + 1;
            }
        }

        return s.substr(startPos, maxLength);
    }
};

耗时和内存消耗很优秀啊,带来的效果确实极大的,还要努力啊!
在这里插入图片描述

附带一个调试的main函数

供测试验证使用

int main(const int argc, const char * argv[])
{
	class Solution solution;
	
	if(argc < 2)
	{
		std::cout << "parameter error" << std::endl;
		return -1;
	}
	
	string s = argv[1];
	std::cout << solution.longestPalindrome(s) << std::endl;
	
	return 0;
}

你可能感兴趣的:(算法)