第一次做csdn的编程挑战赛

来源:互联网 发布:阿里云域名转让 编辑:程序博客网 时间:2024/05/16 23:51

回文字符串

题目详情:

回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串。


输入:非空仅由小写字母组成的字符串,长度不超过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 exceptionreturn 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;}}}