挑战编程:回文字符串
题目描述:
回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串。
输入:非空仅由小写字母组成的字符串,长度不超过100;
输出:能组成的所有回文串(因为结果可能非常大,输出对1000000007取余数的结果)。
例如:输入"aabb" 输出为2,输出对应的所有回文字符串:abba和baab
函数头部 c: int palindrome(const char *s); c++ int palindrome(const string &s);
挑战规则:
main函数可不用完成
对比数据:
864920675:aaaabbbbcccceeeeddddddffffgggghhhhjjjjiiiikkkkkkkkkkkkkkkkllllll
2:aabb
2520:fdfdfdfdeeeeerrrr
7560:fdfdfdfdqqqqqqwwwww
0:aaabbb
题目分析:
1、内部包含的每个字符的个数为奇数的数量,不能超过1个
2、每个字符在挑选位置时,可以理解成一个组合C(n, j)
3、取余公式:
(a + b) mod m = ((a mod m) + (b mod m)) mod m
(a*b) mod m = ((a mod m) * (b mod m)) mod m
例如:fdfdfdfdqqqqqqwwwww
{f,d,q,w}对应的个数{4,4, 6, 5},那么放在中间位置应该是‘w’。那么当前的字符串为“#########w#########”,我只考虑半个字符串“#########”。则{f,d,q,w}对应的数目为{2, 2, 3, 2},所以用统计学的方法不难发现其值为C(9,2)*C(7,2)*C(5,3)*C(2,2)
#include <iostream>
#include <string>using namespace std;int palindrome(const string &s);
int main()
{string str = "aaaabbbbbbcccceeeeddddddffffgggghhhhjjjjiiiikkkkkkkkkkkkkkkkllllll";cout << palindrome(str) << endl;getchar();return 0;
}// 统计学中组合的求发:C(iMax, index)
int GetCombination(int imax, int index)
{int result = 1;int iDivider = 1;for (int i = 1; i <= index; i ++){result = result * imax;if (i <= index){iDivider = iDivider*i;}imax --;}return result / iDivider;
}int palindrome(const string &s)
{unsigned long long palindromeTotal = 1;const unsigned int modulus = 1000000007;int recordArr[26] = {0};int ia = (int)'a';// 获取每个字符的个数表for (int i = 0; i < s.size(); i ++){int index = (int)s[i] - ia;recordArr[index] ++;}int iOddTotals = 0;int iMaxIndexTotal = 0;for (int i = 0; i < 26; i ++){if (recordArr[i] != 0){if (recordArr[i] % 2 != 0){iOddTotals ++;recordArr[i] --;}recordArr[i] = recordArr[i] / 2;iMaxIndexTotal += recordArr[i]; }}if (iOddTotals > 1){return 0;}unsigned int res = 0;for (int i = 0; i < 26; i ++){if (recordArr[i] != 0){// 计算余数的算法,这样可以数据防止越界//原理://(a + b) mod m = ((a mod m) + (b mod m)) mod m//(a*b) mod m = ((a mod m) * (b mod m)) mod mpalindromeTotal = palindromeTotal * GetCombination(iMaxIndexTotal, recordArr[i]);palindromeTotal %= modulus;iMaxIndexTotal -= recordArr[i];}}return (int)palindromeTotal;
}
挑战编程:回文字符串相关推荐
- c语言编程判断输入的一个字符串是否是“回文”。所谓“回文”字符串就是左读和右读都一样的字符串。例如: “abcba“就是一个回文字符串。
编程判断输入的一个字符串是否是"回文".所谓"回文"字符串就是左读和右读都一样的字符串.例如: "abcba"就是一个回文字符串. 要求:先 ...
- 联想回文字符串的编程题
1. 判断是否是回文序列,输入是整数或者字符串 import stringdef isPalindrome_str(s: str) -> bool:"""判断是否视 ...
- Python编程练习:回文字符串
任务 给定一个字符串,输出所有长度至少为2的回文子串. 回文子串即从左往右输出和从右往左输出结果是一样的字符串,比如:abba,cccdeedccc都是回文字符串. 输入 一个字符串,由字母或数字组成 ...
- [PTA C语言]判断回文字符串——编程题
判断回文字符串 输入一个字符串,判断该字符串是否为回文.回文就是字符串中心对称,从左向右读和从右向左读的内容是一样的. 输入格式: 输入在一行中给出一个不超过80个字符长度的.以回车结束的非空字符串. ...
- 统计任意字符串中回文字符串的个数
题目来源: 庞果英雄会 题目详情: 回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串. 输入:非空仅由小写字母组成的字 ...
- 判断字符串是否为回文字符串_字符串文字
判断字符串是否为回文字符串 String objects hold ordered sequences of bytes, typically characters, usually to form ...
- C语言判断回文字符串
C语言判断回文字符串 #include<stdio.h> char *huiwen(char *str){int i, j,t=0;for(i = 0,j = strlen(str) - ...
- NYOJ 回文字符串
回文字符串 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然, ...
- java判断回文字符串几种简单的实现
11年it研发经验,从一个会计转行为算法工程师,学过C#,c++,java,android,php,go,js,python,CNN神经网络,四千多篇博文,三千多篇原创,只为与你分享,共同成长,一起进 ...
最新文章
- Spring中使用Log4j记录日志
- VMware虚拟机安装WIN7
- 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图
- 数据结构与算法JavaScript (一) 栈
- 一次完整的Loadrunner基本流程操作
- c语言除法效率问题,【图片】今天写几个性能测试,为什么C语言跑得这么慢呢??【c语言吧】_百度贴吧...
- LeetCode 460. LFU缓存(哈希双链表)
- 解混淆/脱壳工具 - De4dot
- 斯皮尔曼相关(Spearman correlation)系数概述及其计算例
- List集合排序及去重
- Python绘制云图
- win10安装VMware PowerCLI
- ModbusTCP协议,上位机通讯测试实例分享
- 基础篇:6.9)形位公差-检测方法Measurement
- html body与页面的距离,html - 如何在TBODY元素之间放置间距
- 【python教程入门学习】拒绝反爬虫!教你搞定爬虫验证码
- 【Java Web基础】(五)实现新增下拉列表—由用户输入内容(Html+JS)
- deepin 下 WPS for linux字体显示问题[已解决]
- MATLAB基础应用精讲-【基础知识篇】MATLAB中的标点符号
- mvn compile报错“程序包com.XXX不存在”