• 面试算法20:回文子字符串的个数


    题目

    给定一个字符串,请问该字符串中有多少个回文连续子字符串?例如,字符串"abc"有3个回文子字符串,分别为"a"、“b"和"c”;而字符串"aaa"有6个回文子字符串,分别为"a"、“a”、“a”、“aa”、“aa"和"aaa”。

    分析

    前面都是从字符串的两端开始向里移动指针来判断字符串是否是一个回文,其实也可以换一个方向从字符串的中心开始向两端延伸。如果存在一个长度为m的回文子字符串,则分别再向该回文的两端延伸一个字符,并判断回文前后的字符是否相同。如果相同,就找到了一个长度为m+2的回文子字符串。例如,在字符串"abcba"中,从中间的"c"出发向两端延伸一个字符,由于"c"前后都是字符’b’,因此找到了一个长度为3的回文子字符串"bcb"。然后向两端延伸一个字符,由于"bcb"的前后都是字符’a’,因此又找到一个长度为5的回文子字符串"abcba"。

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

    public class Test {
        public static void main(String[] args) {
            int result = countSubstrings("aaa");
            System.out.println(result);
        }
    
        public static int countSubstrings(String s) {
            if (s == null || s.length() == 0) {
                return 0;
            }
    
            int count = 0;
            for (int i = 0; i < s.length(); i++) {
                count += countPalindrome(s, i, i);
                count += countPalindrome(s, i, i + 1);
            }
            return count;
        }
    
        private static int countPalindrome(String s, int start, int end) {
            int count = 0;
            while (start >= 0 && end < s.length() && s.charAt(start) == s.charAt(end)) {
                count++;
                start--;
                end++;
            }
    
            return count;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    修改oem.img镜像文件
    计算机多媒体
    vscode终端命令报错
    【解锁未来】探索Web3的无限可能性-01
    【汇编语言】3.汇编语言程序
    A Survey on Explainable Artificial Intelligence (XAI): Toward Medical XAI学习笔记
    考完PMP认证还需要考NPDP认证吗?
    每日五道java面试题之java基础篇(九)
    torch.jit.trace与torch.jit.script
    为什么字节大量用GO而不是Java?
  • 原文地址:https://blog.csdn.net/GoGleTech/article/details/133676582