📌  相关文章
📜  国际空间研究组织 | ISRO CS 2014 |问题 19(1)

📅  最后修改于: 2023-12-03 15:07:34.155000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2014 | 问题 19

题目描述

给定一个由字母和数字组成的字符串,编写一个函数判断其中是否存在一个回文子串(回文子串即正着读和倒着读都一样的字符串)。如果存在,则返回该子串的长度,否则返回0。

函数签名
public static int longestPalindromeSubstring(String str)
输入
  • 字符串str,仅由数字和大小写字母组成,1 <= str.length <= 1000
输出
  • 若存在回文子串,则返回该子串的长度
  • 否则,返回0
示例
示例1

输入

str = "abcdcb"

输出

5

说明

最长的回文子串为"bcdcb",长度为5。

示例2

输入

str = "banana"

输出

5

说明

最长的回文子串为"anana",长度为5。

示例3

输入

str = "xyz"

输出

0

说明

不存在回文子串,返回0。

实现思路

本题的解法为中心扩展法。

对于给定的字符串,遍历每个字符,以该字符为中心向两侧扩展,并判断扩展出的子串是否为回文串。

为了考虑到回文串长度可能为奇数或偶数的情况,在判断回文串时,分别考虑以当前字符为中心的子串及以当前字符和下一个字符的中心做为子串,两者最长的回文串取最终答案。

代码实现
public static int longestPalindromeSubstring(String str) {
    int maxLength = 0;
    for (int i = 0; i < str.length(); i++) {
        // 中心为单个字符的回文串长度
        int len1 = expandStr(str, i, i);
        // 中心为两个字符的回文串长度
        int len2 = expandStr(str, i, i + 1);
        maxLength = Math.max(maxLength, Math.max(len1, len2));
    }
    return maxLength;
}

private static int expandStr(String str, int left, int right) {
    while (left >= 0 && right < str.length() && str.charAt(left) == str.charAt(right)) {
        left--;
        right++;
    }
    return right - left - 1;
}

该方法的时间复杂度为 $O(N^2)$,其中 $N$ 为字符串长度,不过实际表现中不会出现最坏情况,因为中心扩展的过程中大多数子串不会是回文子串,因此时间复杂度会更小。

总结

本题的解法较为简单,但需要注意判断回文串的两种情况:奇数长度和偶数长度。本题考查了对一些基本算法的掌握,例如字符串的遍历和中心扩展法等。该算法不仅仅用于字符串的回文子串判断,还可以应用在一些其他领域,例如找到一组数列中的最长回文子序列。

希望小伙伴们可以牢记这些算法原理和实现细节,丰富自己的算法库!