【中等】算法nodeJs:密码截取

116 阅读1分钟

描述

Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些 "ABBA" 、"ABA" 、"A" 、"123321"。
但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 "ABBA"→"12ABBA" 、"ABA"→"ABAKK","123321"→"51233214" 。因为截获的串太长了,而且存在多种可能的情况( "abaaab" 可看作是 "aba" 或 "baaab" 的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?

输入描述:

在一行上输入一个长度为 1≦length(s)≦2500 ,仅由大小写字母和数字构成的字符串 s ,代表截获的密码。

输出描述:

在一行上输出一个整数,代表最长的有效密码串的长度。

image.png

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    line = await readline();
    const dp = Array(line.length).fill(1);
    for (let i = 0; i < line.length; i++) {
        // 情况 1:以 i 为中心,向左右扩展(奇数长度)
        let left = i - 1,
            right = i + 1;
        while (left >= 0 && right < line.length && line[left] === line[right]) {
            dp[right] = Math.max(dp[right], right - left + 1);
            left--;
            right++;
        }

        // 情况 2:以 i 和 i+1 为中心,向左右扩展(偶数长度)
        left = i;
        right = i + 1;
        while (left >= 0 && right < line.length && line[left] === line[right]) {
            dp[right] = Math.max(dp[right], right - left + 1);
            left--;
            right++;
        }
    }

    console.log(Math.max(...dp));
})();