第一次做csdn的编程挑战赛

回文字符串

题目详情:

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值