【原创】回文字符串
// test.cpp : 定义控制台应用程序的入口点。
// editor: Visual C++ 2010 express
// system: win7 x32
// create: 2013-07-24 16:58FM
// author: jiang kejun <jinhua_k9@163.com>
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
int palindrome(const string &s);
int _tmain(int argc, _TCHAR* argv[])
{
string s;
cout<<"please:"<<"";
cin>>s;
cout<<palindrome(s)<<endl;
system("pause");
return 0;
}
const int OWARN = 1;
const int DWARN = 2;
const string Az = "abcdefghijklmnopqrstuvwxyz";
int palindrome(const string &s)
{
int i=0,pos=0,j=0;
int L = s.length();
if(L>100) return 0;
int A[26]={0};
while(i<L)
{
pos = Az.find(s.at(i));
if(pos!=-1){
if(A[pos]==0){
A[pos]=1;
j++;
}
else{
A[pos]+=1;
}
}
i++;
}
if(j==1) return j;
if(j==L) return 0;
int odd=0,C=0;
for(int b=0;b<26;b++){
if(A[b]>0){
if(A[b]%2!=0){
odd++;
if(A[b]>DWARN){
C = C+(A[b]-1)/DWARN;
continue;
}
} else{
if(A[b]>DWARN){
C = C+(A[b]/DWARN);
continue;
}
}
if(A[b]!=OWARN){
C++;
}
}
}
if(odd>OWARN) return 0;
int R=1;
while(C>0){
R *= C;
C--;
}
return R;
}
php way:
/**
* @author jiang kejun <jinhua_k9@163.com>
* @since 2013.7.24
* @name 回文字符串 input a-z output number
* @version $Id: index.php 59 2013.7.24 create jkj $
*
* @param string $s
* @return int >=0
*/
function palindrome($s)
{
define("OWARN", 1); // 奇数预警值
define("DWARN", 2); // 对数预警值
$L = strlen($s);
if($L>100) trigger_error("No more than 100");
$A = array();
// 生成数组例 a=>4, b=>2, c=>1 对应字符串s 为 aaaabbc
for($i=0;$i<$L;$i++){
if(in_array($s{$i}, array_keys($A))){
$A[$s{$i}] += 1;
} else{
$A[$s{$i}] = 1;
}
}
//$C = sizeof($A);
if(sizeof($A) == 1) return 1;
if(sizeof($A) == $L) return 0;
$vals = array_values($A);
$odd = 0;
$C = 0; // 重新校对
foreach($vals as $v)
{
if($v%2!=0){
$odd++;
if($v>DWARN){
$C = $C+($v-1)/DWARN;
continue;
}
// 偶数对数
} else{
if($v>DWARN){
$C = $C+($v/DWARN);
continue;
}
}
if($v!=OWARN) {
$C++;
}
}
// aaabcc=>0
if($odd>OWARN) return 0;
$R = 1;
while($C >0){
$R *= $C;
$C--;
}
return $R;
}
if(php_sapi_name()=="cli"){
$s = $argv[1];
echo "num is ".palindrome($s);
}