我是靠谱客的博主 甜蜜铃铛,最近开发中收集的这篇文章主要介绍回文子串汇总,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

647. 回文子串

一、中心扩展法1:


        1. 以k为中心:  left=k-1, right=k+1


        2. 以k右边的空白位置为中心: left=k, right = k+1

class Solution {
    public int countSubstrings(String s) {
        int n = s.length();
        char[] letters = s.toCharArray();
        int ans = n;
        for (int k = 0; k < n; k++) {
            // 以letters[k]为中心向两边扩
            int i = k - 1, j = k + 1;
            while (i >= 0 && j < n && letters[i] == letters[j]) {
                i--;
                j++;
                ans++;
            }
            // 以letters[k]右侧的空白位置为中心向两边扩
            i = k;
            j = k + 1;
            while (i >= 0 && j < n && letters[i] == letters[j]) {
                i--;
                j++;
                ans++;
            }
        }
        return ans;
    }
}

复杂度:

时间:O(n^2)

空间:O(1)

一、中心扩展法2:

1. 扩展中心点是 left 和 right 的起始点,如果以一个字符为中心点进行扩展,abab这个序列永远弄不出来,所以扩展的中心点分为 1个(n种可能) 和 2个(n-1中可能),一共2n-1个

2. center为中心点,算出left、right与center之间的关系:
            int left = center / 2;
            int right = left + center % 2;

3. 外层for循环遍历中心点,内层while() 进行向外扩展并判断

class Solution {
    public int countSubstrings(String s) {
        // 中心扩展法,
        int ans = 0;
        for (int center = 0; center < 2 * s.length() - 1; center++) {
            // left和right指针和中心点的关系是
            int left = center / 2;
            int right = left + center % 2;

            while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
                ans++;
                left--;
                right++;
            }
        }
        return ans;
    }
}

复杂度:

时间:O(n^2)

空间:O(1)

二、动态规划法:

class Solution {
    public int countSubstrings(String s) {
        // 动态规划法
        int n = s.length();
        boolean[][] dp = new boolean[n][n];
        int ans = 0;
        for (int j = 0; j < s.length(); j++) {
            for (int i = 0; i <= j; i++) {
                if (s.charAt(i) == s.charAt(j) && (j - i < 2 || dp[i + 1][j - 1])) {
                    dp[i][j] = true;
                    ans++;
                }
            }
        }

        return ans;
    }
}

复杂度:

时间:O(n^2)

空间:O(n^2)


5. 最长回文子串

 一、中心拓展法(遍历2n-1次):

class Solution {
    public String longestPalindrome(String s) {
        //中心拓展法,遍历2n-1次
        int n = s.length();
        String tmp = "";
        for(int k = 0; k < 2*n-1; k++){
            int left = k / 2;
            int right = left + k % 2;
            while(left >= 0 && right < n && s.charAt(left) == s.charAt(right)){
                tmp = tmp.length() < s.substring(left, right+1).length() ? s.substring(left, right+1) : tmp;
                left--;
                right++;
            }
        }
        return tmp;
    }
}

复杂度:

时间:O(n^2)

空间:O(1)

 一、中心拓展法(遍历n次,):

因为ans初值为n,进入while循环的都是回文串长度 > 1的情况,所以这里设置index标记回文串长度是超过1

class Solution {
    public String longestPalindrome(String s) {
        boolean index = false;
        int n = s.length();
        char[] letters = s.toCharArray();
        int ans = n;
        String res = "";
        String tmp = "";
        for (int k = 0; k < n; k++) {
            // 以letters[k]为中心向两边扩
            int i = k - 1, j = k + 1;
            while (i >= 0 && j < n && letters[i] == letters[j]) {
                index = true;
                tmp = s.substring(i, j + 1);
                if (tmp.length() > res.length()) {
                    res = tmp;
                }
                i--;
                j++;
                ans++;

            }
            // 以letters[k]右侧的空白位置为中心向两边扩
            i = k;
            j = k + 1;
            while (i >= 0 && j < n && letters[i] == letters[j]) {
                index = true;
                tmp = s.substring(i, j + 1);
                if (tmp.length() > res.length()) {
                    res = tmp;
                }
                i--;
                j++;
                ans++;
            }
        }

        return index == true? res: s.substring(0,1);
    }
}

复杂度:

时间:O(n^2)

空间:O(1)

最后

以上就是甜蜜铃铛为你收集整理的回文子串汇总的全部内容,希望文章能够帮你解决回文子串汇总所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部