1、输入一个只含有英文字母的字符串,输出最大回文子串的长度及此长度回文子串的个数(回文不区分大小写)。
样例:
输入: aBaAb (最大回文子串为BaAb)
输出: 4 1
输入: aBcbBb (最大回文子串为Bcb和bBb)
输出: 3 2
输入: a B
输出: 1 2
输入: aBcbB
输出: 3 1
输入: aaaaaa
输出: 6 1
#include <iostream>
#include <string>
#include <map>
using namespace std;
bool isHw(string s) {
int i, l;
l = s.length();
for (int i = 0; i < l / 2; i++) {
if (toupper(s[i]) != toupper(s[l - i - 1])) return false;
}
return true;
}
int main() {
string s;
while (getline(cin, s)) {
int i, j, maxl, num = 0;
map<int, int> m;
map<string, int> ms;//防止相同的回文串重复计数,按题目意思应该是统计同一长度不同的串
maxl = 0;
for (i = 0; i < s.length(); i++) {
if(!isalpha(s[i])) continue;
string str;
for (j = i; j < s.length(); j++) {
if(!isalpha(s[j])) {
str = "";
continue;
}
str += s[j];
if (isHw(str) && ms[str] == 0) {
ms[str]++;
if (str.length() > maxl) maxl = str.length();
m[str.length()]++;
}
}
}
if(maxl != 0) cout << maxl << " " << m[maxl] << endl;
}
return 0;
}
2、哥德巴赫猜想
任何一个大于2的偶数均可表示为两个素数之和。输入m, n(6<=m<=n<=50),则把[m, n]内的所有偶数表示成两个素数之和的形式。输出这些素数及其出线的次数,输出次序按照素数出现的次数从多到少输出;若出线次数相同,按照素数从大到小输出;若偶数有多种素数相加形式,则把所有的情况都输出,每种情况占一行。
输入:
8 9
输出:
5 1 3 1
输入:
9 10
输出:
5 2
7 1 3 1
输入:
14 15
输出:
11 1 3 1
7 2
输入:
8 10
输出:
3 2 7 1 5 1
5 3 3 1
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v;
map<int, int> mmp;
bool cmp(int a, int b) {
if(mmp[a] == mmp[b]) return a > b;
return mmp[a] > mmp[b];
}
bool isPrime(int n) {
if(n == 1) return false;
for(int i = 2; i <= n / 2; i++) {
if(n % i == 0) return false;
}
return true;
}
void dfsPrime(int m, int n) {
if(m >= n && !v.empty()) {
sort(v.begin(), v.end(), cmp);
map<int, int> op;
for(int i = 0; i < v.size(); i++) {
op[v[i]]++;
if(op[v[i]] == 1 && mmp[v[i]] != 0) cout << v[i] << " " << mmp[v[i]] << " ";
}
cout << endl;
return ;
}
else {
if(m % 2 != 0) m++;
for(int j = 2; j <= m / 2; j++) {
if(isPrime(j) && isPrime(m - j)) {
v.push_back(j);
v.push_back(m - j);
mmp[j]++;
mmp[m - j]++;
dfsPrime(m + 1, n);
v.pop_back();
v.pop_back();
mmp[j]--;
mmp[m- j]--;
}
}
}
}
int main() {
int m, n;
while(cin >> m >> n) {
dfsPrime(m, n);
}
return 0;
}
PS: 第二题当前用例正常,比如10 16 就会异常,目前没Debug出来,回头在更新, mark!