我目前正在尝试计算出给定字符串中有多少个子串是回文。
当给出字符串 aabaa 时,预期输出 5 但是我的代码输出 4 。我不太清楚为什么,任何人都可以帮我解决这个问题吗?
我的代码:
function countPalindromesInString(s) {
let count = 0;
if (s === s.split('').reverse().join('')) {
count += 1;
}
let testStr = '';
for (let i = 0; i < s.length; i++) {
testStr += s[i];
if (testStr === testStr.split('').reverse().join('')) {
count += 1;
}
}
return count;
}
答案 0 :(得分:2)
我不确定为什么您希望输入 5 输入 aabaa 。 从我的观点来看,如果你认为单个字母作为回文而不是输出 9 ,否则结果应该 4 :&#34; aa&#34 ;,&#34; aa&#34;,&#34; aba&#34;,&#34; aabaa&#34;。您的代码仅从左到右计数,并且还会在开头一次对完整的5个字母字符串进行双重计数,此处为:
if (s === s.split('').reverse().join('')) {
count += 1;
}
和for case循环中的一次 i = 4 ;
以下是您问题的解决方案:
function countPalindromesInString(s) {
let count = 0; //or s.length if you chose to count single letters as palindrome
let subString;
for (let i = 1; i < s.length; i++) {
for(let j = 0; j < s.length - i; j++) {
subString = s.substring(j, j+i+1);
if(subString === subString.split('').reverse().join('')) {
count += 1;
}
}
}
return count;
}
稍后编辑:
如果我们想要计算字符串中的独特回文,我们可以存储数组中找到的回文,每次我们找到另一个时,我们会检查它是否曾经添加过:
function countPalindromesInString(s) {
let subStrings = [];
for (let i = 0; i < s.length; i++) {
for(let j = 0; j < s.length - i; j++) {
let subString = s.substring(j, j+i+1);
if(subString === subString.split('').reverse().join('') && !subStrings.includes(subString)) {
subStrings.push(subString);
}
}
}
return subStrings.length;
}