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. mDNS 原理的简单理解

    转自:http://www.binkery.com/post/318.html mDNS 原理的简单理解 mDNS multicast DNS , 使用5353端口. 在局域网内,你要通过一台主机和其 ...

  2. 基于Tags的简单内容推荐的实现

    原来为了简单方便,自己小网站上的文章页的相关内容推荐就是从数据库里随机抽取数据来填充一个列表,所以一点相关性都没有,更本没有办法引导用户去访问推荐内容. 算法选择 如何能做到相似内容的推荐呢,碍于小网 ...

  3. Linux下常用函数-字符串函数

    inux下常用函数-字符串函数 atof(将字符串转换成浮点型数)  相关函数   atoi,atol,strtod,strtol,strtoul 表头文件   #include <stdlib ...

  4. 最快理解 - IO多路复用:select / poll / epoll 的区别.

    目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...

  5. Java生成随机数的三种方式

    package cn.zytao.taosir.random; import java.util.Random; public class RandomDemo { private static In ...

  6. redis 模拟搭建集群

    一.本文是在一台 linux 系统上,模拟搭建 redis 集群.3 台主机,3 台从机. 二.redis 安装步骤 http://www.cnblogs.com/fangwu/p/8602357.h ...

  7. chrome安装插件,安装Postman

    1.下载postman插件,可以自己到网上下载,也可以点击http://download.csdn.net/detail/u010246789/9528471 2.解压文件,在解压后的文件夹中找到.c ...

  8. 编译打包部署 Dubbo Admin

    1.下载,Dubbo地址: https://github.com/alibaba/dubbo/tree/2.5.x ,直接ZIP下载 2.解压并打开项目,mvn package 得到war包,如下图: ...

  9. BA-DDC与PLC的比较(转载)

    1.概念 DDC(Direct Digital Control ) ,根据字面的意思为直接的数据控制,它包含了对采集数据的数字化以及对数据的数字处理.DDC的产生式随着楼宇控制.能源管理的需求,以及为 ...

  10. iOS_21团购_地图功能

    终于效果图: 右下角的回到用户位置button: MapController控制器, 是主控制器左側dock上面的[地图]button相应的控制器, 继承自ShowDealDetailControll ...