5. 最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

暴力解法: 列出子串, 求出符合条件的子串存入map, 筛选出最大值存入

func longestPalindrome(s string) string {
if s == "" {
return ""
}
if isPalindrome(s) {
return s
} pdMap := make(map[string]int)
for i := 0; i < len(s); i++ {
for j:=len(s);j>i+1;j--{
tmp := s[i:j]
//fmt.Println(tmp)
if isPalindrome(tmp) {
pdMap[tmp] = len(tmp)
}
}
}
max := 0
rst := ""
for k,v := range pdMap {
if v > max {
max = v
rst = k
}
}
if rst == "" {
return s[0:1]
}
return rst
} func isPalindrome(s string) bool {
if len(s) < 1 {
return false
}
if len(s) == 2 && s[0]==s[1]{
return true
}
for i:=0;i<len(s)/2;i++{ // 3/2 = 1 4/2 = 2
if s[i] != s[len(s)-i-1] {
return false
}
}
return true
}

  

优化1: 因为题目只要求 最长, 所以只需要返回最长的就可以了, 引入map实际上浪费了空间

package main

import "fmt"

//给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
//
//示例 1:
//
//输入: "babad"
//输出: "bab"
//注意: "aba" 也是一个有效答案。
//示例 2:
//
//输入: "cbbd"
//输出: "bb" func main() {
s := "abb"
fmt.Println(longestPalindrome(s))
} func longestPalindrome(s string) string {
if s == "" {
return ""
}
if isPalindrome(s) || len(s) < 2 {
return s
} max := 0
rst := "" for i := 0; i < len(s); i++ {
for j:=len(s);j>i+1;j--{
tmp := s[i:j]
//fmt.Println(tmp)
if isPalindrome(tmp) {
if max < len(tmp) {
max = len(tmp)
rst = tmp
}
}
}
} if rst == "" {
return s[0:1]
}
return rst
} func isPalindrome(s string) bool {
if len(s) < 1 {
return false
}
if len(s) == 2 && s[0]==s[1]{
return true
}
for i:=0;i<len(s)/2;i++{ // 3/2 = 1 4/2 = 2
if s[i] != s[len(s)-i-1] {
return false
}
}
return true
}

大神解法:

func longestPalindrome(s string) string {
if len(s) < 2 { // 肯定是回文,直接返回
return s
} // 最长回文的首字符索引,和最长回文的长度
begin, maxLen := 0, 1 // 在 for 循环中
// b 代表回文的**首**字符索引号,
// e 代表回文的**尾**字符索引号,
// i 代表回文`正中间段`首字符的索引号
// 在每一次for循环中
// 先从i开始,利用`正中间段`所有字符相同的特性,让b,e分别指向`正中间段`的首尾
// 再从`正中间段`向两边扩张,让b,e分别指向此`正中间段`为中心的最长回文的首尾
for i := 0; i < len(s); { // 以s[i]为`正中间段`首字符开始寻找最长回文。
if len(s)-i <= maxLen/2 {
// 因为i是回文`正中间段`首字符的索引号
// 假设此时能找到的最长回文的长度为l, 则,l <= (len(s)-i)*2 - 1
// 如果,len(s)-i <= maxLen/2 成立
// 则,l <= maxLen - 1
// 则,l < maxLen
// 所以,无需再找下去了。
break
} b, e := i, i
for e < len(s)-1 && s[e+1] == s[e] {
e++
// 循环结束后,s[b:e+1]是一串相同的字符串
} // 下一个回文的`正中间段`的首字符只会是s[e+1]
// 为下一次循环做准备
i = e + 1 for e < len(s)-1 && b > 0 && s[e+1] == s[b-1] {
e++
b--
// 循环结束后,s[b:e+1]是这次能找到的最长回文。
} newLen := e + 1 - b
// 创新记录的话,就更新记录
if newLen > maxLen {
begin = b
maxLen = newLen
}
} return s[begin : begin+maxLen] }

  

这里还有一些算法, 由leetCode官方提供:

https://leetcode-cn.com/problems/longest-palindromic-substring/solution/

LeetCode Golang 5. 最长回文子串的更多相关文章

  1. 每日一道 LeetCode (48):最长回文子串

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  2. 【LeetCode】5# 最长回文子串

    题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意 ...

  3. python刷LeetCode:5. 最长回文子串

    难度等级:中等 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab& ...

  4. leetcode题目5.最长回文子串(中等)

    题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: ...

  5. leetcode.字符串.5最长回文子串-Java

    1. 具体题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" ...

  6. leetcode 5/300 最长回文子串 py

    目录 题目说明 方法一:动态规划--状态转移方程 方法二:优化中心扩展算法 题目说明 要看明白求得是什么,最长回文字串是指例如cababa中ababa是最长的,不是求回文的部分aba 方法一:动态规划 ...

  7. 【LeetCode 5】 最长回文子串

    题目链接 描述 [题解] 一个讲得比较好的博客地址; 感觉manacher算法的大概思路就是利用回文串左右对称的性质. 利用之前算出来的以某个点为中心的回文串.而当前要枚举的串被包括在其中. 则可以用 ...

  8. 求最长回文子串 - leetcode 5. Longest Palindromic Substring

    写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...

  9. LeetCode之“字符串”:最长回文子串

    题目要求: 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串.例如,给出字符串 "abcdzdcab",它的最长回文子串为 & ...

随机推荐

  1. Shader渲染动画

    一.概述 先看一下Shader类的介绍: /** * Shader is the based class for objects that return horizontal spans of col ...

  2. awk一次性分别赋值多个value给多个变量,速度对比

    方法 #方法1: echo "apple banana orange" | awk '{print $1,$2,$3}' | while read a b c do echo a= ...

  3. WSDL详解(一)

    WSDL文档使用web服务描述语言来定义服务. 文档包括逻辑(抽象)部分和具体部分. 抽象部分用于定义独立于实现的数据类型和消息,具体部分定义一个endpoint如何实现一个可以与外界进行交互的服务. ...

  4. Project Euler 13 Large sum

    题意:计算出以下一百个50位数的和的前十位数字. /************************************************************************* ...

  5. ie7 text-indent input影响

    IE6/IE7中text-indent对input背景的影响 在text-indent在IE6/IE7中的位置偏移BUG一文中讨论过IE6/IE7中inline-block元素设置text-inden ...

  6. 11 个 Visual Studio 代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

  7. 大菲波数 【杭电-HDOJ-1715】 附题+具体解释

    /* 大菲波数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  8. SpringMVC 理论与有用技术(二)文件上传

    文件上传相信大家都做过,差点儿全部的项目都有上传文件的功能,尤其是BS架构的项目中经常被列为常规功能来开发.不管是在开发.NET 项目还是java项目我们会用到非常多的框架,这个功能也被集成到了框架之 ...

  9. Linux 下安装 jdk-7u79-linux-x64.gz,jdk1.7.0_79,jdk1.7步骤:

    1.首先下载对应CentOS版本的jdk:这里我下载的是jdk-7u79-linux-x64.tar.gz 2.上传到CentOS下的目录中 3.新建一个APP目录作为存储jdk的目录 4.解压jdk ...

  10. 常见问题处理之Emoji

    所谓Emoji就是一种在Unicode位于\u1F601-\u1F64F区段的字符.这个显然超过了目前常用的UTF-8字符集的编码范围\u0000-\uFFFF.Emoji表情随着IOS的普及和微信的 ...