回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串。 输入:非空仅由小写字母组成的字符串,长度不超过100; 输出:能组成的所有回文串的个数(因为结果可能非常大,输出对1000000007取余数的结果)。 例如:输入"aabb" 输出为2(因为“aabb”对应的所有回文字符串有2个:abba和baab) 函数头部 c: int palindrome(const char *s); c++ int palindrome(const string &s); java public static int palindrome(String s) ;
package cn.baokx;
public class PalindromeTest {
public static void main(String args[]){
String str = "aaaabbbb";
System.out.println(palindrome(str));
}
public static int palindrome(String s){
int result = 0 ;
//将字符串去重
String s1 = s.replaceAll("(?s)(.)(?=.*\\1)","").trim();
//存放每个字符重复的次数
int [] repeat_times = new int[s1.length()] ;
int foot = 0 ;
for(int i = 0 ; i < s1.length() ; i++){
char temp = s1.charAt(i);
repeat_times[i] = s.length()-s.replaceAll(temp+"","").length();
if(repeat_times[i]%2!=0){
foot++;
}
//若有1个以上的字符重复次数为奇数则注定无法组成回文字符串
if(foot>1){
return 0;
}
}
//除数
java.math.BigInteger divisor = new java.math.BigInteger("1") ;
int length = 0 ;
for(int i = 0 ; i < repeat_times.length ; i++){
length += repeat_times[i]/2;
//找到重复次数大于2的字符,将其/2后的阶乘累乘起来做除数
if(repeat_times[i]>2){
int tmp = repeat_times[i]/2;
for(int j = tmp ; j > 0 ; j--){
divisor = divisor.multiply(new java.math.BigInteger(j+""));
}
}
}
//被除数
java.math.BigInteger dividend = new java.math.BigInteger("1") ;
for(int i = length ; i > 0 ; i-- ){
dividend = dividend.multiply(new java.math.BigInteger(i+""));
}
System.out.println(dividend+"/"+divisor);
result = (dividend.divide(divisor)).divideAndRemainder(new java.math.BigInteger("1000000007"))[1].intValue();
return result;
}
}