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

在这里插入图片描述

题目链接:

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

示例 1:

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

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

中心扩散方法

从中心向两端寻找,最终得到最大的字符串
在这里插入图片描述

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);
    }
};

执行结果
实际效果并不是很优秀。
在这里插入图片描述

参考一下优秀的

动态规划思想

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值