LeetCode Golang 5. 最长回文子串
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. 最长回文子串的更多相关文章
- 每日一道 LeetCode (48):最长回文子串
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 【LeetCode】5# 最长回文子串
题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意 ...
- python刷LeetCode:5. 最长回文子串
难度等级:中等 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab& ...
- leetcode题目5.最长回文子串(中等)
题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: ...
- leetcode.字符串.5最长回文子串-Java
1. 具体题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" ...
- leetcode 5/300 最长回文子串 py
目录 题目说明 方法一:动态规划--状态转移方程 方法二:优化中心扩展算法 题目说明 要看明白求得是什么,最长回文字串是指例如cababa中ababa是最长的,不是求回文的部分aba 方法一:动态规划 ...
- 【LeetCode 5】 最长回文子串
题目链接 描述 [题解] 一个讲得比较好的博客地址; 感觉manacher算法的大概思路就是利用回文串左右对称的性质. 利用之前算出来的以某个点为中心的回文串.而当前要枚举的串被包括在其中. 则可以用 ...
- 求最长回文子串 - leetcode 5. Longest Palindromic Substring
写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...
- LeetCode之“字符串”:最长回文子串
题目要求: 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串.例如,给出字符串 "abcdzdcab",它的最长回文子串为 & ...
随机推荐
- 洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000 ...
- Echarts堆积柱状图排序问题
Echarts堆积柱状图排序是按照堆积柱状图的柱子高度进行从大到小(或者从小到大)进行排序,方便查阅各坐标情况.以下是我自己研发的方法,有不对的地方敬请谅解,随时欢迎指教. 排序后效果如下图: (1) ...
- babel把ES6转化为ES5的时候报错
Module not found: Error: Can't resolve '@babel/runtime/helpers/asyncToGenerator' in 'e:\Node.js\Node ...
- vue组件通信,点击传值,动态传值(父传子,子传父)
转载:https://blog.csdn.net/xr510002594/article/details/83304141 一.父组件传子组件,核心--props 在这里触发 handleClick ...
- 洛谷—— P1457 城堡 The Castle
https://www.luogu.org/problem/show?pid=1457 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特 ...
- rabbitMQ学习笔记(五) 消息路由
生产者会生产出很多消息 , 但是不同的消费者可能会有不同的需求,只需要接收指定的消息,其他的消息需要被过滤掉. 这时候就可以对消息进行过滤了. 在消费者端设置好需要接收的消息类型. 如果不使用默认的E ...
- spring boot不同环境读取不同配置
具体做法: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中:prod环境下的配置配置在application-prod.prope ...
- HDU 2732 Leapin' Lizards(拆点+最大流)
HDU 2732 Leapin' Lizards 题目链接 题意:有一些蜥蜴在一个迷宫里面,有一个跳跃力表示能跳到多远的柱子,然后每根柱子最多被跳一定次数,求这些蜥蜴还有多少是不管怎样都逃不出来的. ...
- Flex AsDoc 完整版
Flex 生成AsDoc用的是SDK自带的asdoc.exe工具 生成AsDoc文档的方式有两种:ant或者FlashBuilder 外部配置工具 方法一:外部配置工具 新增一个外部配置工具.过程例如 ...
- Android之弹出菜单框【注冊上下文菜单】
注冊上下文菜单:(长按弹出一个菜单) 第一种创建方法(与长按事件结合): public class MainActivity extends Activity { private TextView u ...