现在的位置: 首页 > 综合 > 正文

回文字符串数量

2012年12月25日 ⁄ 综合 ⁄ 共 810字 ⁄ 字号 评论关闭

回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串。 输入:非空仅由小写字母组成的字符串,长度不超过100; 输出:能组成的所有回文串的个数(因为结果可能非常大,输出对1000000007取余数的结果)。 例如:输入"aabb" 输出为2(因为“aabb”对应的所有回文字符串有2个:abba和baab)


#include <iostream>
#include <string>
using namespace std;

int palindrome(const string &s)
{
    int count[26];

    for (int i = 0; i < 26; i++)
    {
        count[i] = 0;
    }

    int len = s.size();
    for (int i = 0; i < len; i++)
    {
        count[s[i]-'a']++;
    }

    int countOfOdd = 0;
    for (int i = 0; i < 26; i++)
    {
       if (count[i] & 1)
       {
           countOfOdd++;
       }
       
       count[i] >>= 1;
    }

    if (countOfOdd > 1)
    {
        return 0;
    }

    long long int result = 1;
    int totalLen = 0;
    for (int i = 0; i < 26; i++)
    {
        if (count[i] > 1)
        {
            bool first = true;
            int factor = 1;
            while (count[i])
            {
                result = result*(totalLen+1);
                if (!first)
                {
                    result /= factor;
                }
                totalLen++;
                count[i]--;
                result %= 1000000007;
                if (first)
                {
                    first = false;
                }
                factor++;
            }
        }
        else if (count[i])
        {
            result = result*(totalLen+1);
            totalLen++;
            result %= 1000000007;
        }
    }
    
    return result;
}

抱歉!评论已关闭.