回文字符串

7 篇文章 0 订阅

【原创】回文字符串


// 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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值