回文函数 - 期望不同的输出 - javascript

问题描述 投票:0回答:1

收到的挑战:弦乐挑战 让函数 stringchallenge str 接受传递的 str 参数,并确定是否可以通过删除 1 或 2 个字符来创建回文字符串或最小长度为 3 个字符的字符串。例如:如果 str 是“abjchba”,那么您可以删除字符 jc 以生成回文 abba。对于此示例,您的程序应返回两个被删除且不带分隔符的字符,并且按照它们在字符串中出现的顺序排列。所以jc。如果无法删除 1 或 2 个字符来生成回文,则返回不可能的字符串。 如果输入字符串已经是回文,您的程序应该返回回文字符串。您的程序应始终删除字符串中较早出现的字符。在里面 上面的例子,你也可以去掉ch形成回文,但jc先出现,所以正确答案是jc。输入仅包含小写字母字符。您的程序应始终尝试通过删除 1 或 2 个字符来创建最长的回文子字符串,请参阅 以第二个示例测试用例为例。您删除的 2 个字符不必在字符串中相邻。

我的问题是,当删除子字符串来创建回文时,我应该怎么做才能让函数给出预期的输出?有人可以帮我吗???

function StringChallenge(str) {
  if(str === str.split("").reverse().join("")) {return str;};
  let result = "";
  for (let i = 0; i < str.length; i++) {
    let items = str[i];
    for (let j = i + 1; j < str.length; j++) {
      items += str[j];
      if (items === items.split("").reverse().join("")) {
        if ( result.length < items.length) {result = items;}
      }
    }
  }  
  return result.length < 3 ? "not possible" : result ;
}
console.log(StringChallenge("kjjjhjjj")); // output expected "k" - output received "jjjhjjj"
console.log(StringChallenge("ana")); // output expected "ana" - ok
console.log(StringChallenge("mmop")); // output expected "not possible" - ok

javascript string output reverse palindrome
1个回答
0
投票

这是您的答案: 我认为这段代码适用于所有测试用例。

function StringChallenge(str) {
    const RESULT_PALINDROME = "palindrome";
    const RESULT_NOT_POSSIBLE = "not possible";

    function reverseString(string) {
        return string.split('').reverse().join('');
    }

    function isPalindrome(string) {
        return string === reverseString(string);
    }

    function createPalindrome(inputStr, reverseOrder) {
        let str = reverseOrder ? reverseString(inputStr) : inputStr;
        let result = '';
        let temp = str;

        for (let i = 0; i < str.length; i++) {
            if (str[i] !== str[str.length - 1 - i]) {
                if (removeCharAndCheck()) return result;
            }
        }
        return RESULT_NOT_POSSIBLE;

        function removeCharAndCheck() {
            result += temp[0];
            temp = temp.substring(1);
            return isPalindrome(temp) && temp.length > 2;
        }
    }

    // If the input string is already a palindrome
    if (isPalindrome(str)) return RESULT_PALINDROME;

    const fromFirst = createPalindrome(str, false);
    const fromLast = createPalindrome(str, true);

    if (fromFirst !== RESULT_NOT_POSSIBLE && fromLast !== RESULT_NOT_POSSIBLE) {
        if (fromFirst.length > 2 || fromLast.length > 2) return RESULT_NOT_POSSIBLE;
        return fromFirst.length > fromLast.length ? fromLast : fromFirst;
    }

    if (fromFirst !== fromLast && fromFirst === RESULT_NOT_POSSIBLE) {
        return fromLast.length > 2 ? RESULT_NOT_POSSIBLE : fromLast;
    }

    if (fromLast !== fromFirst && fromLast === RESULT_NOT_POSSIBLE) {
        return fromFirst.length > 2 ? RESULT_NOT_POSSIBLE : fromFirst;
    }

    return RESULT_NOT_POSSIBLE;
}

console.log(StringChallenge("kjjjhjjj"));
console.log(StringChallenge("ana")); 
console.log(StringChallenge("mmop")); 

© www.soinside.com 2019 - 2024. All rights reserved.