代码随想录-Day52
647. 回文子串
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
示例 1:
输入:s = “abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”
示例 2:
输入:s = “aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
方法一:
class Solution {
public int countSubstrings(String s) {
char[] chars = s.toCharArray();
int len = chars.length;
boolean[][] dp = new boolean[len][len];
int result = 0;
for (int i = len - 1; i >= 0; i--) {
for (int j = i; j
这段代码是用于解决「最长回文子序列」问题的Java实现。给定一个字符串 s,目标是找到 s 中最长的回文子序列的长度。这里所说的“子序列”是指由原字符串中删除若干个字符(也可以不删除)后,保持剩余字符相对顺序不变所组成的新字符串。
代码解析
-
初始化动态规划数组:
- 创建一个二维数组 dp,其大小为 (len + 1) x (len + 1),其中 len 是字符串 s 的长度。dp[i][j] 的值代表 s 中从下标 i 到下标 j 的子串中最长回文子序列的长度。额外的一行和一列是为了方便边界条件的处理。
-
动态规划迭代:
- 从 len - 1 到 0 反向遍历字符串 s 的每个字符,作为子串的起始点 i。
- 对于每个起始点 i,从 i + 1 开始到字符串的末尾遍历每个可能的结束点 j。
- 对于每一对起始点和结束点 i 和 j:
- 如果 s 在 i 和 j 位置的字符相等,那么 dp[i][j] 的值等于去掉这两个字符后子串的最长回文子序列长度加2,即 dp[i + 1][j - 1] + 2。
- 如果 s 在 i 和 j 位置的字符不相等,那么 dp[i][j] 的值取 dp[i + 1][j]、dp[i][j] 和 dp[i][j - 1] 中的最大值,代表从 i 到 j 的子串的最长回文子序列长度。
-
返回结果:
- 最后返回 dp[0][len - 1],即整个字符串 s 的最长回文子序列的长度。
时间复杂度和空间复杂度
- 时间复杂度: O(n^2),其中 n 是字符串 s 的长度。这是因为需要遍历所有可能的子串组合。
- 空间复杂度: O(n^2),需要一个大小为 n x n 的动态规划数组 dp 来存储中间结果。
总结
这段代码通过动态规划方法,有效地解决了最长回文子序列问题。通过构建二维数组 dp 来追踪子串中可能的最长回文子序列的长度,避免了对每个子串进行单独的回文性和长度检查,从而提高了效率。在处理字符串回文相关问题时,这种方法是一种常见的有效策略。如果需要进一步优化空间复杂度,可以考虑使用滚动数组技术,但由于回文子序列问题的特性,这种优化可能不如其他问题那样明显或直接。在实际应用中,选择适当的优化策略取决于具体需求和资源限制。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!



