构造回文字符串问题

71 阅读1分钟

问题描述

小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t,并且这个字符串需要满足以下几个条件:

  1. t 由小写字母组成,且长度与 s 相同。
  2. t 是回文字符串,即从左到右与从右到左读取相同。
  3. 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();