前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2021-12-22:回文子串。 给你一个字符串 s ,请你统计并返

2021-12-22:回文子串。 给你一个字符串 s ,请你统计并返

原创
作者头像
福大大架构师每日一题
发布于 2021-12-22 15:16:04
发布于 2021-12-22 15:16:04
2160
举报

2021-12-22:回文子串。

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

回文字符串 是正着读和倒过来读一样的字符串。

子字符串 是字符串中的由连续字符组成的一个序列。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:

输入:s = "abc",

输出:3,

解释:三个回文子串: "a", "b", "c"。

示例 2:

输入:s = "aaa",

输出:6,

解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"。

提示:

1 <= s.length <= 1000,

s 由小写英文字母组成。

力扣647。

答案2021-12-22:

马拉车算法。每个中心求个数然后求和。

时间复杂度:O(n)。

空间复杂度:O(n)。

代码用golang编写。代码如下:

代码语言:txt
AI代码解释
复制
package main

import "fmt"

func main() {
    s := "moonfdd"
    ret := countSubstrings(s)
    fmt.Println(ret)
}

func countSubstrings(s string) int {
    if len(s) == 0 {
        return 0
    }
    dp := getManacherDP(s)
    ans := 0
    for i := 0; i < len(dp); i++ {
        ans += dp[i] >> 1
    }
    return ans
}

func getManacherDP(s string) []int {
    str := manacherString(s)
    pArr := make([]int, len(str))
    C := -1
    R := -1
    for i := 0; i < len(str); i++ {
        if R > i {
            pArr[i] = getMin(pArr[2*C-i], R-i)
        } else {
            pArr[i] = 1
        }
        for i+pArr[i] < len(str) && i-pArr[i] > -1 {
            if str[i+pArr[i]] == str[i-pArr[i]] {
                pArr[i]++
            } else {
                break
            }
        }
        if i+pArr[i] > R {
            R = i + pArr[i]
            C = i
        }
    }
    return pArr
}

func manacherString(str string) []byte {
    charArr := []byte(str)
    res := make([]byte, len(str)*2+1)
    index := 0
    for i := 0; i != len(res); i++ {
        if i&1 == 0 {
            res[i] = '#'
        } else {
            res[i] = charArr[index]
            index++
        }
    }
    return res
}

func getMin(a, b int) int {
    if a < b {
        return a
    } else {
        return b
    }
}

执行结果如下:

图片
图片

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2021-02-06:假设字符串str长度为N,请问最长回文子串的长度是多少?
3)理解 L…(i`)…C…(i)…R 的结构,以及根据i’回文长度进行的状况划分。
福大大架构师每日一题
2021/02/06
5340
2021-02-06:假设字符串str长度为N,请问最长回文子串的长度是多少?
2021-02-13:字符串str最少添加多少个字符变成回文串?
假设字符串str是“abcde12344321”,在str后添加“edcba”即可变成回文串。需要添加5个字符。
福大大架构师每日一题
2021/02/13
4760
2021-02-13:字符串str最少添加多少个字符变成回文串?
2021-06-08:一个字符串至少要切几刀能让切出来的子串都是回文串?
方法二、对字符串范围做是否是回文串的dp。dpi=true是i,j范围上是回文串,dpi依赖左下方。消耗O(N**2)的空间。
福大大架构师每日一题
2021/06/08
2220
2021-06-08:一个字符串至少要切几刀能让切出来的子串都是回文串?
2021-06-06:一个字符串添加最少的字符变成回文串,请返回其中一个结果。
从dp右上角出发,看dp的左边,下边,左下边。如果dp和左边差值是1,朝左走;如果dp和下边差值是1,朝下走;剩余情况,朝左下走。
福大大架构师每日一题
2021/06/06
4760
2021-06-06:一个字符串添加最少的字符变成回文串,请返回其中一个结果。
计算最长回文子串_用递归判断是否为回文字符串
前面我们讲过一个关于字符串的算法:KMP算法。今天我们来讲另外一个字符串算法:Manacher算法。这个算法是用于解决一个问题叫:最长回文子串。
全栈程序员站长
2022/11/19
6260
计算最长回文子串_用递归判断是否为回文字符串
2021-06-10:一个字符串用最少刀数切出来的子串都是回文串,返回所有划分结果 。
2021-06-10:一个字符串用最少刀数切出来的子串都是回文串,返回所有划分结果 。
福大大架构师每日一题
2021/06/10
3780
2021-06-10:一个字符串用最少刀数切出来的子串都是回文串,返回所有划分结果 。
2021-06-09:一个字符串用最少刀数切出来的子串都是回文串,返回其中一种划分结果 。
2021-06-09:一个字符串用最少刀数切出来的子串都是回文串,返回其中一种划分结果 。
福大大架构师每日一题
2021/06/09
4550
2021-06-09:一个字符串用最少刀数切出来的子串都是回文串,返回其中一种划分结果 。
天池 在线编程 回文子串(区间动态规划)
回文串是从左往右和从右往左读相同的字符串,例如121和tacocat。子串是一个字符串中任意几个连续的字符构成的字符串。
Michael阿明
2021/09/06
2510
2021-06-07:一个字符串添加最少的字符变成回文串,回文串有多个,请返回所有结果。
2021-06-07:一个字符串添加最少的字符变成回文串,回文串有多个,请返回所有结果。
福大大架构师每日一题
2021/06/07
5620
2021-06-07:一个字符串添加最少的字符变成回文串,回文串有多个,请返回所有结果。
leetcode 647. 回文子串 js实现
https://leetcode.cn/problems/palindromic-substrings/description/
蓓蕾心晴
2022/11/18
5000
【LeetCode】647. 回文子串
输入:“abc” 输出:3 解释:三个回文子串: “a”, “b”, “c” 示例 2:
韩旭051
2021/04/14
3970
2021-02-18:给定一个字符串str,给定一个字符串类
2021-02-18:给定一个字符串str,给定一个字符串类型的数组arr,出现的字符都是小写英文。arr每一个字符串,代表一张贴纸,你可以把单个字符剪开使用,目的是拼出str来。返回需要至少多少张贴纸可以完成这个任务。例子:str= "babac",arr = {"ba","c","abcd"}。a + ba + c 3 abcd + abcd 2 abcd+ba 2。所以返回2。
福大大架构师每日一题
2021/02/18
4990
2021-02-18:给定一个字符串str,给定一个字符串类
2021-04-27:如果一个字符相邻的位置没有相同字符
2021-04-27:如果一个字符相邻的位置没有相同字符,那么这个位置的字符出现不能被消掉。比如:"ab",其中a和b都不能被消掉 。如果一个字符相邻的位置有相同字符,就可以一起消掉。比如:“abbbc”,中间一串的b是可以被消掉的, 消除之后剩下“ac”。某些字符如果消掉了,剩下的字符认为重新靠在一起。给定一个字符串,你可以决定每一步消除的顺序,目标是请尽可能多的消掉字符,返回最少的剩余字符数量。比如:"aacca", 如果先消掉最左侧的"aa",那么将剩下"cca",然后把"cc"消掉,剩下的"a"将无法再消除,返回1。但是如果先消掉中间的"cc",那么将剩下"aaa",最后都消掉就一个字符也不剩了,返回0,这才是最优解。 再比如:"baaccabb",如果先消除最左侧的两个a,剩下"bccabb",如果再消除最左侧的两个c,剩下"babb", 最后消除最右侧的两个b,剩下"ba"无法再消除,返回2。而最优策略是:先消除中间的两个c,剩下"baaabb",再消除中间的三个a,剩下"bbb",最后消除三个b, 不留下任何字符,返回0,这才是最优解。
福大大架构师每日一题
2021/05/04
4830
2021-04-27:如果一个字符相邻的位置没有相同字符
LeetCode 647. 回文子串(DP/中心扩展)
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
Michael阿明
2020/07/13
5980
2021-06-24:求一个字符串中,最长无重复字符子串长度。
2021-06-24:求一个字符串中,最长无重复字符子串长度。 福大大 答案2021-06-24: 方法一:滑动窗口。自然智慧。 不重复的时候,右指针右移;重复的时候,左指针右移。 方法二:求出最右不重复位置。 map:key是值,value是数组序号,初始值value都是-1。 时间复杂度:O(N)。空间复杂度:O(不同字符个数)。 代码用golang编写。代码如下: package main import "fmt" func main() { s := "moonfdd" ret1 := le
福大大架构师每日一题
2021/06/25
2740
2021-06-24:求一个字符串中,最长无重复字符子串长度。
一天一大 lee(回文子串)难度:中等-Day20200819
之前做过验证回文串的题目:20200619:验证回文串 (难度:简单)[2]既然可以验证一个字符串是否为回文字符串了,那么就只剩枚举字符串的子区间了
前端小书童
2020/09/24
2520
一天一大 lee(回文子串)难度:中等-Day20200819
动态规划:回文子串
题目链接:https://leetcode-cn.com/problems/palindromic-substrings/
代码随想录
2021/04/23
5800
2021-06-11:给定两个字符串s1和s2,问s2最少删除多少字符可以成为s1的子串?
2021-06-11:给定两个字符串s1和s2,问s2最少删除多少字符可以成为s1的子串? 比如 s1 = "abcde",s2 = "axbc"。
福大大架构师每日一题
2021/06/11
3630
2021-06-11:给定两个字符串s1和s2,问s2最少删除多少字符可以成为s1的子串?
最长回文子串 python_最长回文子序列
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
全栈程序员站长
2022/11/03
1.7K0
647. 回文子串
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 示例 1: 输入:"abc" 输出:3 解释:三个回文子串: "a", "b", "c" 示例 2: 输入:"aaa" 输出:6 解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa" class Solution { public int countSubstrings(Stri
编程张无忌
2021/06/01
3000
推荐阅读
相关推荐
2021-02-06:假设字符串str长度为N,请问最长回文子串的长度是多少?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档