ARTS第八周

Algorithm

shortest-palindrome
给定一个字符串s,在s前增加最少字符串使得回文
还是上一周的算法
KMP实现方法
KMP算法分享主要计算每个索引位置,前缀最长重复字符串表(文中最后分享)
反转s为reverse,新字符串为s+"#"+reverse,找新字符串最后一位前缀匹配程度,即s前缀回文程度,只需要在s前补充反转字符串剩余不回文的部分
比如:

public String shortestPalindrome(String s) {
        StringBuilder reverse = new StringBuilder(s).reverse();
        // reverse = abcbabcaba
        // newStr = reverse+"#" + s 即abcbabcaba#abacbabcba
        // 找newStr最后一位和前缀匹配程度,即s前缀的回文程度,需要补充的字符串为出去回文字符串剩余的反转字符串
        String newStr = s + "#" + reverse;

        int[] f = calculateTable(newStr);
        for (int item : f) {
            System.out.print(item);
        }
        System.out.println();
        return reverse.substring(0, s.length() - f[newStr.length() - 1]) + s;
    }

public int[] calculateTable(String subStr) {
        // 计算table
        int[] f = new int[subStr.length()];
        f[0] = 0;
        int t = 0;
        char temp;
        for (int i = 1; i < subStr.length(); i++) {
            temp = subStr.charAt(i);
            if (temp == subStr.charAt(t)) {
                f[i] = ++t;
            } else {
                while (t > 0) {
                    // 假设到b不匹配,b之前匹配度为caca即t,t=4
                    // 拿caca继续找匹配度(索引从0开始)t=f[t-1]=f[3]=2,s[t]=s[2]=c≠b
                    // 拿ca继续找t=f[t-1]=f[1]=0匹配度为0结束
                    t = f[t - 1];
                    if (t >= 0) {
                        if (temp == subStr.charAt(t)) {
                            f[i] = ++t;
                            break;
                        }
                    }
                }
            }
        }
        return f;
    }

Review

distributed-system-microservices
提出了一些微服务基本的一些优缺点

Tips

Share

KMP算法

你可能感兴趣的:(ARTS第八周)