# 字符串回文判断
# 题目内容
给定一个仅由小写英文字母组成的字符串 $s$,请判断它是否可以在删除一个字符之后,变成一个回文串。回文串的定义是:从左到右读和从右到左读完全相同。如果可以,输出一个数组,数组由可删除字符的索引值构成;否则输出一个空数组。
# 输入描述
输入一个字符串 $s$,$2 \le s.length \le 10^5$。
# 输出描述
输出一个数组,内容为:$N$ 种删除方法的字符索引值。如输入为:abca,则输出为:[1, 2],代表可以有两种删除方式:[aba, aca]。
- 1:删除索引值为 1 的字符,即删除字符 b,则变为:aca,属于回文
- 2:删除索引值为 2 的字符,即删除字符 c,则变为:aba,属于回文
# 样例
# 样例 1
输入
abca
1
输出
1,2
1
说明: 删除 b 或删除 c 后,都可以变成回文串。
# 样例 2
输入
abcd
1
输出
1
说明: 无论删除哪个字符,都无法变成回文串。
# 代码
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on('line', (input) => {
const arr = input.split('');
let left = 0;
let right = input.length - 1;
const ans = [];
if (arr.length === 2) {
console.log('0,1');
}
while (left < right) {
if (input[left] === input[right]) {
left++;
right--;
} else if (input[left+1] === input[right]) {
ans.push(left);
if (left+1 === right) {
ans.push(right);
}
left++;
} else if (input[left] === input[right-1]) {
ans.push(right);
if (left === right-1) {
ans.push(left);
}
right--;
}
}
console.log(ans.join(','));
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
← 单词搜索计数 部门绩效汇总[200分] →