📜  检查所有回文子串是否都是奇数长度(1)

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

检查回文子串是否都是奇数长度

回文子串是指从前往后读和从后往前读都一样的字符串。例如,字符串 "abba"、"racecar" 和 "noon" 都是回文子串。

现在的任务是检查给定字符串中的所有回文子串是否都是奇数长度。

解决方案
思路

我们可以通过枚举字符串中的每个字符,并向两边扩展来找到所有的回文子串。当找到回文子串时,我们可以判断其长度是否为奇数,如果是则继续检查下一个回文子串;如果不是,则判定为不符合条件,直接返回 false。

实现

以下是一种基于中心扩展的实现方式:

public boolean checkPalindromicSubstrings(String s) {
    for (int i = 0; i < s.length(); i++) {
        if (!checkPalindromicSubstring(s, i, i)) return false; // 奇数长度回文子串
        if (i < s.length() - 1 && !checkPalindromicSubstring(s, i, i + 1)) return false; // 偶数长度回文子串
    }
    return true;
}

private boolean checkPalindromicSubstring(String s, int left, int right) {
    while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
        left--;
        right++;
    }
    return (right - left - 1) % 2 == 1; // 判断回文子串长度是否为奇数
}
复杂度

时间复杂度:$O(n^2)$,其中 $n$ 为字符串的长度。

空间复杂度:$O(1)$。

总结

本任务需要检查回文子串的长度是否都是奇数,我们可以通过枚举每个字符,并以它为中心向两边扩展来找到所有的回文子串。当找到回文子串时,判断其长度是否为奇数即可。时间复杂度为 $O(n^2)$,空间复杂度为 $O(1)$。