给出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");
}
})();