回文字符串
题目详情:
回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串。
输入:非空仅由小写字母组成的字符串,长度不超过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) ;
主要就是使用概率中个排列组合的内容,已经测试得到恨到的数,不产生溢出..提交没成功import java.io.BufferedReader;
import java.io.InputStreamReader;
public class palindrome {
public static void main(String []args){
try
{
System.out.println("请输入少于100个的小写字母组成的字符串!");
String s="";
BufferedReader in=new BufferedReader (new InputStreamReader(System.in));
s=in.readLine();
palindrome p=new palindrome();
int num=p.palindrome(s);
System.out.println("能组成的回文数为"+num);
}catch (Exception e){};
}
public static int palindrome(String s){
int n=0;
long mun=0,rep = 1;
int[] zm=new int[26];
char[] str=new char[100];
for(int i=0;i<26;i++){
zm[i]=0;
}
for(int i=0;i<s.length();i++){
str[i]=s.charAt(i);
int t=str[i]-'a';
zm[t]++;
}
for(int j=0;j<26;j++){
if((zm[j]%2)==1){n++;}
}
if(n>1){
return 0;
}
else{
int m=s.length()/2;
for(int k=0;k<26;k++){
rep=rep*jieceng(zm[k]/2);
}
try {
mun=jieceng(m)/rep;
return (int) (mun%1000000007);
} catch (ArithmeticException e) {
// TODO: handle exception
return 1;
}
}
}
public static long jieceng(int n){
if(n==0){return 1;}
else {
long m=1;
for(int i=1;i<=n;i++){
m*=i;
}
return m;
}
}
}