LeetCode Longest Palindromic Substring 最长回文子串问题(C++)

通过动态规划解决LeetCode的最长回文子串问题,思路是从回文串的对称中心出发,降低时间复杂度从O(n^3)优化到O(n^2)。
摘要由CSDN通过智能技术生成

题目描述:

Given a string s, return the longest palindromic substring in s.

Example :

Input: s = "babad"
Output: "bab"
Note: "aba" is also a valid answer

Input: s = "cbbd"
Output: "bb"

Input: s = "a"
Output: "a"

Input: s = "ac"
Output: "a"

思路:

这是一道经典的动态规划入门题,最容易想到的方法是O(n^3)复杂度的暴力解法,是三层循环,最外层是从左往右的遍历,代表子字符串头i;中间是每一个从i出发的字符串尾j,从右往左遍历;第三层是判断(i,j)是不是回文串。其实暴力解法往往都是优质算法的起步,所以首先想到暴力解法并不愚蠢,重点是要如何优化他。

暴力解的做法是【由外向内】包围子字符串,那么可不可以换个思路,【由内向外】来找到子字符串呢?观察回文字符串的特点,它必然有一个对称中心,这个对称中心可能是一个字符(比如bab中间的a),可能是两个字符中间的位置(比如bb中间),这个中心对称点可能存在的位置有2n-1个。

如果我们把找字符串头尾的两层循环,变成找字符串中心对

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值