对称之美

26 阅读1分钟

给出n个字符串,从第1个字符串一直到第n个字符串每个串取一个字母来构成一个新字符串,新字符串的第i个字母只能从第i行的字符串中选出,这样就得到了一个新的长度为n的字符串,请问这个字符串是否有可能为回文字符串?
ac.nowcoder.com/acm/contest…

🔍 算法思路解析

解决这个问题,你需要抓住回文串的核心特征:​​对称位置的字符必须相同​​。 我们不需要真的去构造所有可能的字符串,只需要判断是否存在一种选择方案。对于最终要构成的长度为 n的新字符串,其第 i个位置上的字符必须能与第 n-i-1个位置上的字符相同(对于所有 i从 0到 n/2)。这意味着,负责提供这两个字符的字符串(即第 i个字符串和第 n-i-1个字符串)​​必须至少拥有一个相同的字符

代码

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
    let params = [];
    while ((line = await readline())) {
        let tokens = line.split(" ");
        params.push(tokens);
    }
    // console.log(params)
    let t = parseInt(params[0][0]);
    let index = 1;
    for (let i = 1; i <= t; i++) {
        let len = parseInt(params[index]);
        let str_arr = params.slice(index + 1, index + 1 + len);
        // console.log(len, index);
        // console.log(str_arr);
        index += len + 1;
        if (str_arr.length === 1) {
            console.log("Yes");
            continue;
        }
        let left = 0;
        let right = str_arr.length - 1;
        let flag = true;
        // console.log(str_arr)
        while (left < right) {
            flag = false;
            for (let i = 0; i < str_arr[left][0].length; i++) {
                if (str_arr[right][0].includes(str_arr[left][0][i])) {
                    flag = true;
                    break;
                }
            }
            if(!flag){
                break;
            }
            left++;
            right--;
        }
        console.log(flag ? "Yes" : "No");
    }
})();