最长回文子串和字符串中回文子串的个数

最长回文子串

思路:将字符串中的每个字符都作为回文串的中心(此处应该考虑到回文串长度为偶数的时候有两个中心)从中心向两边扩展求出一个回文串的长度遍历完字符串后取最长的回文串

class Solution {
     
    public String longestPalindrome(String s) {
     
        String res = "";
        for(int i = 0;i<s.length();i++){
     
            // 回文串中心为一个字符时(回文串长度为奇数)
            String s1 = palindrome(s,i,i);
            // 回文串中心为两个字符(回文串长度为偶数)
            String s2 = palindrome(s,i,i+1);
            res = res.length()>s1.length()?res:s1;
            res = res.length()>s2.length()?res:s2;
        }
        return res;
    }

    // 从中心分别向两端拓展
    public String palindrome(String s,int left,int right){
     
        while(left>=0&&right<s.length()&&s.charAt(left)==s.charAt(right)){
     
            left--;
            right++;
        }
        // 字符串的substring(int startIndex,int endIndex)方法左闭右开 取不到endIndex
        return s.substring(left+1,right);
    }
}

字符串中回文串的个数
使用二维动态规划

class Solution {
     
    public int countSubstrings(String s) {
     
        int count = 0;
        // dp数组的含义是字串s[i....j]是否为回文串
        boolean [][]dp = new boolean[s.length()][s.length()];

        // i==j时字符串中的每个单个字符肯定为回文字串
        for(int i = 0;i<s.length();i++){
     
            dp[i][i] = true;
            count++;
        }

        //遍历字符串中所有的子串 如果为回文串则count++
        for(int right = 1;right<s.length();right++){
     
            for(int left = 0;left<right;left++){
     
                //如果子串的首尾相等 并且字符串长度<=3或者除去首尾中间也为回文串 则此时的字符串一定为回文串
                if(s.charAt(left)==s.charAt(right)&&(right-left<=2||dp[right-1][left+1])){
     
                    dp[right][left] = true;
                    count++;
                }
            }
        }
        return count;
    }
}

你可能感兴趣的:(字符串,leetcode)