Javascript 通过反转子串查找最长回文

Javascript 通过反转子串查找最长回文,javascript,algorithm,Javascript,Algorithm,我想找到最长的回文。我有两个指针,从字符串的第一个字母开始。对于外部循环中的每个字母,我遍历内部循环中的所有其他字母,并使用子字符串,它是起始字母外部循环和结束字母内部循环之间的差异。我反转这个子字符串并检查反转的版本是否与原始版本相同。有了这些,我知道我找到了一个回文。这个算法适用于除一个之外的大多数测试用例,我不知道为什么 功能最长回文str{ const string=str.toLowerCase; 如果str.length

我想找到最长的回文。我有两个指针,从字符串的第一个字母开始。对于外部循环中的每个字母,我遍历内部循环中的所有其他字母,并使用子字符串,它是起始字母外部循环和结束字母内部循环之间的差异。我反转这个子字符串并检查反转的版本是否与原始版本相同。有了这些,我知道我找到了一个回文。这个算法适用于除一个之外的大多数测试用例,我不知道为什么

功能最长回文str{ const string=str.toLowerCase; 如果str.length<2,则返回null; 让回文=; 函数stringReverser开始、结束{ const reversed=string.substrstart,end.split.reverse.join; 反向返回; }
对于let i=0;i原始实现中的错误是substr参数是begin,length,其中原始代码似乎对第二个参数的含义有错误的假设。请参阅

下面是对示例代码的一个小改动,它有更正确的输出:

功能最长回文str{ const string=str.toLowerCase; 如果str.length<2,则返回null; 让回文=; 函数stringReverser开始,长度{ const reversed=string.substrstart,length.split.reverse.join; 反向返回; } 对于let i=0;iconsole.logresult3//应返回“kayak”,但返回“t”。原始实现中的错误是substr参数是begin,length,其中原始代码似乎对第二个参数的含义有错误的假设。看

下面是对示例代码的一个小改动,它有更正确的输出:

功能最长回文str{ const string=str.toLowerCase; 如果str.length<2,则返回null; 让回文=; 函数stringReverser开始,长度{ const reversed=string.substrstart,length.split.reverse.join; 反向返回; } 对于let i=0;iconsole.logresult3//应返回“kayak”,但应返回“t”。我建议提取所选子字符串,并使用isPalendrome函数:

function longestPalindrome (str) {
  const inputString = str.toLowerCase();
  if (str.length < 2) return null;
  let longestPalindrome = '';

  function isPalendrome(strParam) {
    return strParam === strParam.split('').reverse().join('');
  }

  for (let i = 0; i <= inputString.length; i++) {
    for (let j = i; j <= inputString.length; j++) {
      const thisStr = inputString.slice(i, j);
      if (!isPalendrome(thisStr)) continue;
      if (thisStr.length > longestPalindrome.length) longestPalindrome = thisStr;
    }
  }
  return longestPalindrome || null;
}

let result1 = longestPalindrome('My mom is called annnna')
let result2 = longestPalindrome('My dad is a racecar athelete')
let result3 = longestPalindrome('That trip with a kayak was quite an adventure!')

console.log(result1)
console.log(result2)
console.log(result3)

我建议提取所选的子字符串,并使用isPalendrome函数:

function longestPalindrome (str) {
  const inputString = str.toLowerCase();
  if (str.length < 2) return null;
  let longestPalindrome = '';

  function isPalendrome(strParam) {
    return strParam === strParam.split('').reverse().join('');
  }

  for (let i = 0; i <= inputString.length; i++) {
    for (let j = i; j <= inputString.length; j++) {
      const thisStr = inputString.slice(i, j);
      if (!isPalendrome(thisStr)) continue;
      if (thisStr.length > longestPalindrome.length) longestPalindrome = thisStr;
    }
  }
  return longestPalindrome || null;
}

let result1 = longestPalindrome('My mom is called annnna')
let result2 = longestPalindrome('My dad is a racecar athelete')
let result3 = longestPalindrome('That trip with a kayak was quite an adventure!')

console.log(result1)
console.log(result2)
console.log(result3)

下面是一个使用数组帮助器的解决方案。回文助手函数检查给定单词是否为回文。过滤器查找返回true的回文,然后使用reduce查找最长的回文

function findLongest(str) {
  let arr = str.split(' ').filter(word => palindrome(word));
  return arr.reduce((a,b) => a.length > b.length ? a : b);
}

function palindrome(str) {
    return str === str.split('').reverse().join('');
}

console.log(findLongest('That trip with a kayak was quite an adventure!'));

下面是一个使用数组帮助器的解决方案。回文助手函数检查给定单词是否为回文。过滤器查找返回true的回文,然后使用reduce查找最长的回文

function findLongest(str) {
  let arr = str.split(' ').filter(word => palindrome(word));
  return arr.reduce((a,b) => a.length > b.length ? a : b);
}

function palindrome(str) {
    return str === str.split('').reverse().join('');
}

console.log(findLongest('That trip with a kayak was quite an adventure!'));
Java代码

findlongestPalindrome函数将参数作为字符串,并返回最长的回文字符串

isAlindrome验证字符串是否为回文

公共类查找最长的回文{

      public static void main(String[] args) {
          System.out.println("-->" + findlongestPalindrome("That trip with a kayak was quite an adventure!"));
      }
      public static String findlongestPalindrome(String s){
          StringBuffer sb = new StringBuffer();
          int len = 0;
          int maxlen = 0;
          String maxString = "";

          char[] arr = s.toCharArray();
          for(int i=0;i<=s.length();i++){
              for(int j=i;j<s.length();j++){
                  System.out.print(arr[j]);
                  sb.append(arr[j]);
                  if(isPalindrome(sb.toString())) {
                      len = sb.toString().length();
                      if(len > maxlen) {
                          maxlen = len;
                          maxString = sb.toString() + "";
                      }
                  }
              }
              sb = new StringBuffer();
              System.out.println();
          }
          return maxString;
      }
      public static boolean isPalindrome(String s){
          StringBuffer sb = new StringBuffer(s);
          return sb.reverse().toString().equals(s);
      }
}Java代码

findlongestPalindrome函数将参数作为字符串,并返回最长的回文字符串

isAlindrome验证字符串是否为回文

公共类查找最长的回文{

      public static void main(String[] args) {
          System.out.println("-->" + findlongestPalindrome("That trip with a kayak was quite an adventure!"));
      }
      public static String findlongestPalindrome(String s){
          StringBuffer sb = new StringBuffer();
          int len = 0;
          int maxlen = 0;
          String maxString = "";

          char[] arr = s.toCharArray();
          for(int i=0;i<=s.length();i++){
              for(int j=i;j<s.length();j++){
                  System.out.print(arr[j]);
                  sb.append(arr[j]);
                  if(isPalindrome(sb.toString())) {
                      len = sb.toString().length();
                      if(len > maxlen) {
                          maxlen = len;
                          maxString = sb.toString() + "";
                      }
                  }
              }
              sb = new StringBuffer();
              System.out.println();
          }
          return maxString;
      }
      public static boolean isPalindrome(String s){
          StringBuffer sb = new StringBuffer(s);
          return sb.reverse().toString().equals(s);
      }

}

只是一个有趣的问题。。string.substri,j.length真的吗?这不只是j吗?您可能想使用substring方法而不是substr。前者的第二个参数是结束索引,它看起来像你的j应该是什么,而后者是在开始索引之后要提取的字符数。如果您进行了更改,您的代码将按原样工作,并返回kayak进行第三次测试。@JaromandaX是的,j循环的逻辑完全是垃圾,不是吗@KimHogeling?那么赛车a就不会被考虑。。。而一个计划巴拿马运河的人没有回文,只有一个兴趣点。。string.substri,j.length真的吗?这不只是j吗?您可能想使用substring方法而不是substr。前者的第二个参数是结束索引,它看起来像你的j应该是什么,而后者是开始后要拉取的字符数
正在修改的索引。如果您进行了更改,您的代码将按原样工作,并返回kayak进行第三次测试。@JaromandaX是的,j循环的逻辑完全是垃圾,不是吗@KimHogeling?那么赛车a就不会被考虑。。。一个巴拿马运河计划的人不会找到回文我爸爸是赛车运动员。。。不退赛车啊,有趣的规定。在第一个示例中,您的代码也忽略了annna,而是返回mom?a>b?a:b根本没有检查长度是的,忘了比较长度。这是一个疏忽,现已修复。这是一个有趣的尝试。问得好。我爸爸是赛车运动员。。。不退赛车啊,有趣的规定。在第一个示例中,您的代码也忽略了annna,而是返回mom?a>b?a:b根本没有检查长度是的,忘了比较长度。这是一个疏忽,现已修复。这是一个有趣的尝试。问得好。