CS-Wiki CS-Wiki
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
  • 刷题模板汇总
  • 一些刷题小技巧
  • 整数 and 位运算

  • 数组

  • 链表

  • 哈希表

  • 字符串

  • 栈

  • 队列

  • 二叉树

  • 前缀树

  • 二分查找

  • 双指针法

    • 双指针法理论基础
    • 左右指针

      • 验证回文串
      • 最多删除一个字符得到回文
      • 回文子字符串的个数
        • 📃 题目描述
        • 🔔 解题思路
          • 暴力
          • 左右指针
        • 💥 复杂度分析
      • 反转字符串
      • 反转字符串II
      • 两数之和 II - 输入有序数组
      • 反转字符串中的单词 III
      • 翻转字符串里的单词
      • 剑指 Offer 58 - II. 左旋转字符串
      • 有序数组的平方
      • 三数之和
      • 四数之和
      • 删除排序链表中的重复元素
      • 删除排序链表中的重复元素 II
      • 删除有序数组中的重复项
      • 压缩字符串
      • 移除元素
      • 移动零
      • 调整数组顺序使奇数位于偶数前面
      • 最短无序连续子数组
      • 找到 K 个最接近的元素
      • 盛最多水的容器
    • 滑动窗口

    • 快慢指针

    • 其他

  • 区间求和问题

  • 排序

  • 回溯算法

  • 贪心算法

  • 动态规划

  • 图

  • 数学

  • 自动机

  • 海量数据和空间限制

  • 05-数据结构与算法
  • 双指针法
  • 左右指针
小牛肉
2022-04-08
目录

回文子字符串的个数

# 📃 题目描述

题目链接:

  • 剑指 Offer II 020. 回文子字符串的个数 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
  • 647. 回文子串 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

给定一个字符串 s ,请计算这个字符串中有多少个回文子字符串。

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

示例 1:

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

示例 2:

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

# 🔔 解题思路

# 暴力

双重循环,时间复杂度 O(N^2)

class Solution {
    public int countSubstrings(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }

        // 回文子串的个数
        int count = 0;
        for (int i = 0; i < s.length(); i ++) {
            for (int j = i; j < s.length(); j ++) {
                if (isPalindrome(s, i, j)) {
                    count ++;
                }
            }
        }

        return count;
    }

    // 左闭右闭
    private boolean isPalindrome(String s, int left, int right) {
        if (left == right) {
            return true;
        }

        while (left < right) {
            if (s.charAt(left) != s.charAt(right)) {
                return false;
            }
            left ++;
            right --;
        }

        return true;
    }
}

# 左右指针

前面判断回文的题目都是从字符串的两端开始向里移动指针来判断字符串是否是一个回文,其实也可以换一个方向从字符串的中心开始向两端延伸。

如果存在一个长度为 m 的回文子字符串,则分别再向该回文的两端延伸一个字符,并判断回文前后的字符是否相同。如果相同,就找到了一个长度为 m+2 的回文子字符串。

例如,在字符串"abcba"中,从中间的"c"出发向两端延伸一个字符,由于"c"前后都是字符'b',因此找到了一个长度为3的回文子字符串"bcb"。然后向两端延伸一个字符,由于"bcb"的前后都是字符'a',因此又找到一个长度为5的回文子字符串"abcba"。

值得注意的是,回文的长度既可以是奇数,也可以是偶数。长度为奇数的回文的对称中心只有一个字符,而长度为偶数的回文的对称中心有两个字符。

class Solution {
    public int countSubstrings(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }

        // 回文子串的个数
        int count = 0;
        for (int i = 0; i < s.length(); i ++) {
            // 奇数,以 s[i] 为中心
            count += countPalindrome(s, i, i);
            // 偶数,以 s[i] 和 s[i + 1] 为中心
            count += countPalindrome(s, i, i + 1);
        }

        return count;
    }

    // 左闭右闭(以 left 和 right 为中心分别向左右两边拓展)
    private int countPalindrome(String s, int left, int right) {
        // 回文子串的个数
        int count = 0;

        while (left >= 0 && right < s.length()) {
            if (s.charAt(left) == s.charAt(right)) {
                // 向左拓展
                left --;
                // 向右拓展
                right ++;

                count ++;
            }
            // 一旦发现不一样,则直接 break,至此是以 left 和 right 为中心能找到的最长回文串了
            else {
                break;
            }
        }

        return count;
    }
}

时间复杂度也是 O(N^2)

# 💥 复杂度分析

  • 空间复杂度:
  • 时间复杂度:

🎁 公众号

各位小伙伴大家好呀,叫我小牛肉就行,目前在读东南大学硕士,上方扫码关注公众号「飞天小牛肉」,与你分享我的成长历程与技术感悟~

帮助小牛肉改善此页面 (opens new window)
Last Updated: 2023/02/16, 11:27:10
最多删除一个字符得到回文
反转字符串

← 最多删除一个字符得到回文 反转字符串→

最近更新
01
我掏出这个多线程轮子,面试官直接全体起立
04-13
02
面试官问你有其他 Offer 吗,该怎样回答
04-10
03
天不生陈志龙,职场万古如长夜
04-06
更多文章>
Theme by Vdoing | Copyright © 2019-2023 飞天小牛肉 | 皖ICP备2022008966号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式