重温算法之回文子串

简介: 感觉做算法题以来,看到这种类似的题型就是循环,然后匹配,实际上时间复杂度这些没有去关注,比如这一题,题友的做法就少了一层循环,时间复杂度肯定比我的小,还是老生常谈的问题,慢慢积累吧,算法这事急不得。

微信截图_20220531173728.png一.题目介绍


1.题目来源


链接:LeetCode


2.题目


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

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

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

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

 示例 1:

输入:s = "abc" 输出:3 解释:三个回文子串: "a", "b", "c"

示例 2:

输入:s = "aaa" 输出:6 解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"  

提示:1 <= s.length <= 1000 s由小写英文字母组成


二.具体实现


1.实现思路


回文算是算法题的经典题型了,只不过是一些题目是变种了,解题的基本思路还是一样的,双层循环,逐一匹配折字符串里的元素,如果相等则是回文,不相等则继续匹配。


2.实现代码


1)自己的实现方式

public int countSubstrings(String s) {
    int res = 0;
    int n = s.length();
    // boolea[i][j] 代表 字符串从i 到 j 是不是回文串
    // 注意,外层循环要倒着写,内层循环要正着写
    // 因为要求dp[i][j] 需要知道dp[i+1][j-1]
    boolean[][] dp = new boolean[n][n];
    for (int i = n - 1; i >= 0; i--) {
        for (int j = i; j < n; j++) {
            // (s.charAt(i)==s.charAt(j) 时,当元素个数为1,2,3个时,一定为回文子串
            if (s.charAt(i) == s.charAt(j) && (j - i <= 2 || dp[i + 1][j - 1])) {
                dp[i][j] = true;
                res++;
            }
        }
    }
    return res;
}
复制代码


2)题友的实现方式


使用的是中心拓展的思想,枚举出所有的子串,然后再判断这些子串是否是回文,枚举每一个可能的回文中心,然后用两个指针分别向左右两边拓展,当两个指针指向的元素相同的时候就拓展,否则停止拓展,即是找到目标回文返回。

微信截图_20220531180412.png


3.运行结果

微信截图_20220531180446.png

微信截图_20220531180515.png

三.题后思考


感觉做算法题以来,看到这种类似的题型就是循环,然后匹配,实际上时间复杂度这些没有去关注,比如这一题,题友的做法就少了一层循环,时间复杂度肯定比我的小,还是老生常谈的问题,慢慢积累吧,算法这事急不得。

目录
相关文章
|
5月前
|
算法 容器
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
|
6月前
|
算法
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
55 1
|
6月前
|
算法
算法系列--动态规划--回文子串系列(下)
算法系列--动态规划--回文子串系列(下)
45 0
|
6月前
|
存储 算法
算法系列--动态规划--回文子串系列(上)
算法系列--动态规划--回文子串系列
51 0
|
6月前
|
算法 Java C++
数据结构与算法面试题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。(提示:使用动态规划或者中心扩散)
数据结构与算法面试题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。(提示:使用动态规划或者中心扩散)
83 0
算法修炼Day57|647. 回文子串 ● 516.最长回文子序列
算法修炼Day57|647. 回文子串 ● 516.最长回文子序列
|
算法
LeetCode算法:求出字符串的最大回文子串 及 长度【只利用字符串反转就可】
LeetCode算法:求出字符串的最大回文子串 及 长度【只利用字符串反转就可】
82 0
|
算法
重温算法之排序链表
这个题目有点麻烦,如果是使用的暴力法,会直接超时,使用自顶向下的归并排序的话,其实也没有多大的提升,目前是没有好的解决方案的,后期继续思考吧。
130 0
重温算法之排序链表
|
算法 测试技术
重温算法之括号生成
对于需要一直寻找到最终结果或者条件的题目,一般使用回溯算法,还有就是不要忽略题目的隐藏的一些点,如果忽略,可能某个测试用例就会报错,同时也要做判空处理。
97 0
重温算法之括号生成
|
算法
重温算法之有效的括号
这个题为什么借助栈会变得很容易呢,因为都是在利用栈先进先出的特点,然后匹配左右括号,如果只有其中之一则不满足,不满足的从栈里取出,剩下的就是满足条件的。
111 0
重温算法之有效的括号