Javascript 通过反转子串查找最长回文
我想找到最长的回文。我有两个指针,从字符串的第一个字母开始。对于外部循环中的每个字母,我遍历内部循环中的所有其他字母,并使用子字符串,它是起始字母外部循环和结束字母内部循环之间的差异。我反转这个子字符串并检查反转的版本是否与原始版本相同。有了这些,我知道我找到了一个回文。这个算法适用于除一个之外的大多数测试用例,我不知道为什么 功能最长回文str{ const string=str.toLowerCase; 如果str.length<2,则返回null; 让回文=; 函数stringReverser开始、结束{ const reversed=string.substrstart,end.split.reverse.join; 反向返回; }Javascript 通过反转子串查找最长回文,javascript,algorithm,Javascript,Algorithm,我想找到最长的回文。我有两个指针,从字符串的第一个字母开始。对于外部循环中的每个字母,我遍历内部循环中的所有其他字母,并使用子字符串,它是起始字母外部循环和结束字母内部循环之间的差异。我反转这个子字符串并检查反转的版本是否与原始版本相同。有了这些,我知道我找到了一个回文。这个算法适用于除一个之外的大多数测试用例,我不知道为什么 功能最长回文str{ const string=str.toLowerCase; 如果str.length
对于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;i
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根本没有检查长度是的,忘了比较长度。这是一个疏忽,现已修复。这是一个有趣的尝试。问得好。