经典算法题 - 回文子串

前言
1 | |
知识点
- 双指针、中心拓展法、动态规划
描述
- 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
- 回文字符串 是正着读和倒过来读一样的字符串。
- 子字符串 是字符串中的由连续字符组成的一个序列。
- 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例1
- 输入:s = “abc”
- 输出:3
- 解释:三个回文子串: “a”, “b”, “c”
示例2
- 输入:s = “aaa”
- 输出:6
- 解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
思路
- 这题我第一时间想到暴力破解法求解,虽然能 AC,但效果不佳。
- 标准的解法是使用中心拓展法,创新思维。
- 当然,动态规划也是一个好解法
代码1,暴力法
- 暴力法的基本思路是找出 s 的所有子串,
- 对所有子串一一判断是否为回文
1 | |
代码2,中心拓展法
- 中心拓展法的基本思路是从 s 的任意位置进行单或双子字符进行拓展判断。
- 如果子字符串是回文,则向左右拓展
- 一直拓展到不能拓展为止
- 其难点在于循环的长度,
- 另外要格外注意 JavaScript 和 Java 之间的差异点
1 | |
总结
- 回文子串这类题其实用双指针很好解决
- 中心拓展法是解决回文类题的关键点
- 动态规划也是其解法之一
经典算法题 - 回文子串
http://jxr202.github.io/algorithm/algorithm_003-43a7c76d77e1/