关闭

第一次做csdn的编程挑战赛

标签: 编程csdnjava
1059人阅读 评论(0) 收藏 举报

回文字符串

题目详情:

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


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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1105次
    • 积分:20
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档