问题描述
小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t,并且这个字符串需要满足以下几个条件:
t由小写字母组成,且长度与s相同。t是回文字符串,即从左到右与从右到左读取相同。t的字典序要小于s,并且在所有符合条件的字符串中字典序尽可能大。
小C想知道是否能构造出这样的字符串 t,输出这样的t。如果无法构造满足条件的字符串,则输出 -1。
function solution(s) {
// PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
// write code here
// return "";
// 将字符串转换为字符数组以便于操作
// 定义一个构造回文字符串的函数
const helper = (s) => {
const n = s.length;
const middle = (n - 1) >> 1;
let l = 0;
let r = n - 1;
const arr = s.split('');
while (l <= middle) {
arr[r] = arr[l];
l++;
r--;
}
return arr.join('');
};
// 首先尝试将当前值构造回文
const res = helper(s);
if (res < s) {
return res;
}
// 如果当前不满足,则从中间位置开始进行遍历
const middle = (s.length - 1) >> 1;
let index = middle;
const arr = s.split('');
while (index >= 0) {
// 如果为a则变为z
if (arr[index] === 'a') {
arr[index] = 'z';
} else {
// 非a的则减少
arr[index] = String.fromCodePoint(arr[index].codePointAt(0) - 1);
break;
}
index--;
}
// 如果没有找到则返回-1
if (index < 0) {
return "-1";
}
return helper(arr.join(''));
}
function main() {
console.log(solution("abc") === "aba");
console.log(solution("cba") === "cac");
console.log(solution("aaa") === "-1");
}
main();