计算一个字符串的子串是多少个回文

时间:2017-11-12 19:54:46

标签: javascript

我目前正在尝试计算出给定字符串中有多少个子串是回文。

当给出字符串 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;
}

1 个答案:

答案 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;
}