当前位置: 首页 > 面试经验 >

京东 8.27 后端面试 第三题 漂亮串 简单解法

优质
小牛编辑
140浏览
2023-03-28

京东 8.27 后端面试 第三题 漂亮串 简单解法

漂亮串那题
楼主当时的解法超时了。写完才发现是 10^6的规模
因此需要O(n)解法才不超时

class Solution {
    // G(n) 代表 长度为n的字符串中不同的漂亮串的个数
    // N(n) 代表 长度为n的字符串中不出现任何red子串的个数
    // G(n)可以拆解成以下两部分:
    // 当前 n-1个字符形成了漂亮串时: 此时 形成了 G(n-1)*26个新的满足要求的串。
    // 当前 n-1个字符没有形成漂亮串时:因为多出来的一个字符,有可能与前面两个字符串形成 red,此时就要求 前 n-3 个字符有且只有一个red
    // 因此我们需要求前 n-3 个字符串中 有且仅有一个red的不同字符串个数:
    // 这个等于  前 n-3 个字符串的所有种类, 减去 前n-3个字符串中所有漂亮字符串个数,再减去 n-3个字符串中 所有不存在的red子串的个数,即N(n)
    // 即 = 26^(n-3) - G(n-3) - N(n-3)
    // 另外 N(n) 可以通过递推公式 N(n) = N(n -1)*26 - N(n-3)得到

    public  int getres(int n) {
        Long MOD = 1000000007L;
        ArrayList<Long> G = new ArrayList<>();
        ArrayList<Long> N = new ArrayList<>();
        ArrayList<Long> P = new ArrayList<>();
        N.addAll(Arrays.asList(1L,26L,26*26L));
        G.addAll(Arrays.asList(0L,0L,0L,0L,0L,0L));
        P.add(1L);
        for(int i=3;i<=n;i++){
            N.add((N.get(i-1)*26 - N.get(i-3))%MOD);
        }
        // 26的几次幂 列表
        for(int i=0;i <n;i++){
            P.add(P.get(i)*26 %MOD);
        }

        for(int i=6;i<=n;i++){
            G.add((G.get(i-1)*26 + P.get(i-3) - G.get(i-3) - N.get(i-3)) % MOD);
        }
        return (int)((G.get(n)+MOD)%MOD);
    }
}


#java##京东##笔试##后端#
 类似资料: