ARTS 第1周(20190325~20190331)

ARTS 是什么?

Algorithm:Longest Palindromic Substring

题目链接见:5. Longest Palindromic Substring,这个题目是找一个字符串的最长回文子串。

最简单的解法就是遍历这种暴力解法,也是想到的第一种解法,实现如下:

    public String solution1(String s) {
        if (s == null || s.length() == 0) {
            return s;
        }
        String ans = s.substring(0, 1);
        int len = s.length();
        for (int i = 2; i <= len; i++) {
            String sub1 = s.substring(0, i);
            for (int j = 0; j < i - 1; j++) {
                String sub2 = sub1.substring(j, i);
                if (isPalindromic(sub2)) {
                    if (sub2.length() > ans.length()) {
                        ans = sub2;
                    }
                }
            }
        }
        return ans;
    }

    public boolean isPalindromic(String s) {
        if (s.length() == 0 && s == null) {
            return false;
        }
        int len = s.length();
        for (int i = 0; i < len / 2; i++) {
            if (s.charAt(i) != s.charAt(len - 1 - i)) {
                return false;
            }
        }
        return true;
    }

但是代码提交之后,发现时间复杂度非常高,看了一下这个时间复杂度是 ,这个解法明显是不可取的,其实,从这个解法也能发现有很多重复的地方,假设当前要判断回文字符串是 (第 i 到第 j 个字符子串),那么其实我们只需要判断 及 即可,但实际上上面的解法会循环遍历,并不会记录之前已经计算过的 的值,这明显是可以优化的。

这里可以想到的一个解法是动态规划,则有下面的递推公式:

初始条件有:


对应的代码实现为:

    public String longestPalindrome(String s) {
        if (s == null || s.length() == 0) {
            return s;
        }
        int len = s.length();
        boolean[][] p = new boolean[len][len];
        int maxNum = 1;
        String ans = s.substring(0, 1);
        for (int k = 0; k < len; k++) {
            for (int i = 0; i < len - k; i++) {
                int j = i + k;
                if (s.charAt(i) == s.charAt(j) && (j - i <= 2 || p[i + 1][j - 1])) {
                    p[i][j] = true;
                    if (j + 1 - i > maxNum) {
                        maxNum = j + 1 - i;
                        ans = s.substring(i, j + 1);
                    }
                }
            }
        }
        return ans;
    }

这样的话,时间复杂度从 缩短为了 ,不过空间复杂度是 变为了 。

但其实还可以在保证时间复杂度为 O(n^2) 的情况下,保证空间复杂度为 ,具体可以参考 Approach 4: Expand Around Center,这种解法其实不是通用的方法,跟这个具体场景有关系,简单来说就是从回文字符串的中间开始像两边进行判断,直到找到最大回文字符串,这种方式也不会有出现重复计算,主要是因为:对于每个为中间的元素(可能是 1 个,也可能是 2 个,根据长度的奇偶数有关系),只会计算一次。

Review

计划是总结《Streaming Systems》第一章前50%的内容,大概10页,但是这本书读起来语言不是那么好理解,还没看完,希望明天能把这个补充完,先拖欠一下。

输出如下:第一章 Streaming 101(本周的是 What is Streaming 部分)

Tip

这里整理了一篇 算法的复杂度分析 的文章。

Share

这里分享一个关于关系代数内容的总结,见:关系代数基础

你可能感兴趣的:(ARTS 第1周(20190325~20190331))