1.一開始想法是對的,就是(總長度/2)!/(每個字母i出現的次數/2)! ,一開始用c++寫的代碼,錯誤是因為數據溢出,而java的BigInteger對于處理大數據的加減乘除是最適合不過的啦
下面是寫得兩個代碼:

c++代碼
1 int _init(string s,int countnum[])
2 {
3 int len=s.length();
4 for(int i=0;i<len;i++)
5 countnum[s[i]-'a']++;
6 return len;
7 }
8 int palindrome(const string &s)
9 {
10 int countnum[26],visit[26];
11 int alphanum;
12 memset(countnum,0,sizeof(countnum));
13 memset(visit,0,sizeof(visit));
14 alphanum=_init(s,countnum);
15 int is_palindrome=0;
16 for(int i=0;i<26;i++)
17 {
18 if(countnum[i]%2==1) {
19 is_palindrome++;
20 visit[i]=1;
21 }
22 }
23 if(is_palindrome>1) return 0;
24 else
25 {
26 long long sum=1;
27 //則除去中間的一個字母還有兩邊的字母,(alphanum-1)/2
28 if(is_palindrome==1){
29 for(int i=1;i<=(alphanum-1)/2;i++)
30 sum=((sum*i)%MAX_VALUE);
31 for(int i=0;i<26;i++)
32 {
33 if(countnum[i]>0)
34 {
35 if(visit[i]!=1){
36 for(int j=2;j<=(countnum[i]/2);j++)
37 {
38 sum=(sum/j)%MAX_VALUE;
39 }
40 }
41 else
42 {
43 for(int j=2;j<=(countnum[i]-1)/2;j++)
44 {
45 sum=(sum/j)%MAX_VALUE;
46 }
47 }
48 }
49 }
50 }
51 else
52 {
53 for(int i=1;i<=(alphanum)/2;i++)
54 sum=((sum*i)%MAX_VALUE);
55 for(int i=0;i<26;i++)
56 {
57 if(countnum[i]>0)
58 {
59 if(visit[i]!=1){
60 for(int j=2;j<=(countnum[i]/2);j++)
61 {
62 sum=(sum/j)%MAX_VALUE;
63 }
64 }
65 else
66 {
67 for(int j=2;j<=(countnum[i]-1)/2;j++)
68 {
69 sum=(sum/j)%MAX_VALUE;
70 }
71 }
72 }
73 }
74 }
75 return sum%MAX_VALUE;
76 }
77 }
78

Java代碼
參考文章:http://blog.csdn.net/u011459840/article/details/9667077
1 public static int palindrome(String s) {
2 int []countnum=new int[26];
3 int len=s.length();
4 int is_can=0;
5 if(s==null||s.length()>100||s.length()<1) return 0;
6 for(int i=0;i<len;i++)
7 {
8 countnum[s.charAt(i)-'a']++;
9 }
10 for(int i=0;i<26;i++){
11 if(countnum[i]%2==1){
12 is_can++;
13 }
14 }
15 if(is_can>1) return 0;
16 else
17 {
18 //求階乘(len/2)!
19 BigInteger result=BigInteger.ONE;
20 for(int i=1;i<=(len/2);i++){
21 result=result.multiply(BigInteger.valueOf(i));
22 }
23 BigInteger dividevalue=BigInteger.ONE;
24 for(int i=0;i<26;i++)
25 {
26 if(countnum[i]>0){
27 for(int j=1;j<=(countnum[i]/2);j++){
28 dividevalue=dividevalue.multiply(BigInteger.valueOf(j));
29 }
30 }
31 }
32 result=result.divide(dividevalue);
33 return result.mod(BigInteger.valueOf(1000000007)).intValue();
34 }
35
下面是寫得兩個代碼:


1 int _init(string s,int countnum[])
2 {
3 int len=s.length();
4 for(int i=0;i<len;i++)
5 countnum[s[i]-'a']++;
6 return len;
7 }
8 int palindrome(const string &s)
9 {
10 int countnum[26],visit[26];
11 int alphanum;
12 memset(countnum,0,sizeof(countnum));
13 memset(visit,0,sizeof(visit));
14 alphanum=_init(s,countnum);
15 int is_palindrome=0;
16 for(int i=0;i<26;i++)
17 {
18 if(countnum[i]%2==1) {
19 is_palindrome++;
20 visit[i]=1;
21 }
22 }
23 if(is_palindrome>1) return 0;
24 else
25 {
26 long long sum=1;
27 //則除去中間的一個字母還有兩邊的字母,(alphanum-1)/2
28 if(is_palindrome==1){
29 for(int i=1;i<=(alphanum-1)/2;i++)
30 sum=((sum*i)%MAX_VALUE);
31 for(int i=0;i<26;i++)
32 {
33 if(countnum[i]>0)
34 {
35 if(visit[i]!=1){
36 for(int j=2;j<=(countnum[i]/2);j++)
37 {
38 sum=(sum/j)%MAX_VALUE;
39 }
40 }
41 else
42 {
43 for(int j=2;j<=(countnum[i]-1)/2;j++)
44 {
45 sum=(sum/j)%MAX_VALUE;
46 }
47 }
48 }
49 }
50 }
51 else
52 {
53 for(int i=1;i<=(alphanum)/2;i++)
54 sum=((sum*i)%MAX_VALUE);
55 for(int i=0;i<26;i++)
56 {
57 if(countnum[i]>0)
58 {
59 if(visit[i]!=1){
60 for(int j=2;j<=(countnum[i]/2);j++)
61 {
62 sum=(sum/j)%MAX_VALUE;
63 }
64 }
65 else
66 {
67 for(int j=2;j<=(countnum[i]-1)/2;j++)
68 {
69 sum=(sum/j)%MAX_VALUE;
70 }
71 }
72 }
73 }
74 }
75 return sum%MAX_VALUE;
76 }
77 }
78


參考文章:http://blog.csdn.net/u011459840/article/details/9667077
1 public static int palindrome(String s) {
2 int []countnum=new int[26];
3 int len=s.length();
4 int is_can=0;
5 if(s==null||s.length()>100||s.length()<1) return 0;
6 for(int i=0;i<len;i++)
7 {
8 countnum[s.charAt(i)-'a']++;
9 }
10 for(int i=0;i<26;i++){
11 if(countnum[i]%2==1){
12 is_can++;
13 }
14 }
15 if(is_can>1) return 0;
16 else
17 {
18 //求階乘(len/2)!
19 BigInteger result=BigInteger.ONE;
20 for(int i=1;i<=(len/2);i++){
21 result=result.multiply(BigInteger.valueOf(i));
22 }
23 BigInteger dividevalue=BigInteger.ONE;
24 for(int i=0;i<26;i++)
25 {
26 if(countnum[i]>0){
27 for(int j=1;j<=(countnum[i]/2);j++){
28 dividevalue=dividevalue.multiply(BigInteger.valueOf(j));
29 }
30 }
31 }
32 result=result.divide(dividevalue);
33 return result.mod(BigInteger.valueOf(1000000007)).intValue();
34 }
35