1、
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入例子:
abcda
输出例子:
2
2
解题思路:先将字符串翻转,再求两个字符创的最大公共子序列,然后就可以知道应该删除那些字符。
区别:最大公共子序列和最大公共子串不同
子串要求在原字符中是连续的,子序列则只需保持相对顺序一致,不需要连续
答案: 大佬啊
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int MAX = 1001;
int MaxLen[MAX][MAX];
int MaxL(string s1,string s2){
for(int i=0;i<=s1.size();i++){
MaxLen[0][i]=0;
}
for(int j=1;j<=s2.size();j++){
MaxLen[j][0]=0;
}
for(int i=1;i<=s1.size();i++){
for(int j=1;j<=s2.size();j++){
if(s1[i]==s2[j]){
MaxLen[i][j]=MaxLen[i-1][j-1]+1;
}else{
MaxLen[i][j]=max(MaxLen[i-1][j],MaxLen[i][j-1]);
}
}
}
return MaxLen[s1.size()][s2.size()];
}
int main(){
string s1;
while(cin>>s1){
string s2=s1;
reverse(s2.begin(),s2.end());
cout<<s1.size()-MaxL(s1,s2)<<endl;
}
return 0;
}2、小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
你能帮帮小Q吗?
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
while (cin >> s)
{
for (int i = 0; i < s.length(); i++)
if (s[i] >= 'a' && s[i] <= 'z')
cout << s[i];
for (int i = 0; i < s.length(); i++)
if (s[i] <= 'Z' && s[i] >= 'A')
cout << s[i];
cout << endl;
}
return 0;
}第三题:
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,相差最小的有多少对呢?相差最大呢?
输入描述:
请在这里输入引用内容
输入包含多组测试数据。
对于每组测试数据:
N - 本组测试数据有n个数
a1,a2...an -需要计算的数据
保证:
1<=N<=100000,0<=ai<=INT_MAX.
输出描述:
对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。
输入例子:
6
45 12 45 32 5 6
输出例子:
1 2
我的答案:(虽然但是,我错了,也不知道为什么)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int n = 0;
cin >> n;
vector<int> nums;
int a ;
for (int i = 0; i < n; i++) {
cin >> a;
nums.push_back(a);
}
sort(nums.begin(), nums.end());
int count = 0;
int min = nums[n - 1] - nums[0];
for (int i = 0; i < n-1; i++) {
if (nums[i + 1] - nums[i] < min) {
count = 0;
min = nums[i + 1] - nums[i];
count++;
}
else if (nums[i + 1] - nums[i] == min) {
count++;
}
}
cout << count << " ";
int max = nums[n - 1] - nums[0];
int id = 0;
int count1 = 0;
for (int j = n - 1; j > 0; j--) {
if (nums[j] - nums[id] == max) {
count1++;
}
else {
break;
}
}
cout << count1 << endl;
return 0;
}注意:
2,4,6,8最小差值对数是3(因为差值都是2),但是2,2,2,2这种情况,最小差值对数就不是三,而是6
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int n;
while(cin >> n)
{
vector<int> nums(n);
for(int i = 0; i < n; i++)
cin>> nums[i];
int minNum = 0, maxNum = 0;
//排序
sort(nums.begin(), nums.end());
//最大
int l = 0, r = n - 1;
int i = 1, j = 1;//i为最小数的个数,j为最大数的个数
while(nums[l] == nums[l + 1]) { i++; l++;}
while(nums[r] == nums[r - 1]) { j++; r--;}
maxNum = i * j;
//最小
int minTemp = nums[1] - nums[0];//最小差值
int count = 1;
for(int i = 2; i < n; i++)
{
if(nums[i] - nums[i - 1] < minTemp)
{
minTemp = nums[i] - nums[i - 1];
count= 1;
}else if(nums[i] - nums[i - 1] == minTemp) count++;
}
if(minTemp > 0) minNum = count;
else
{
for(int i = 1; i < n; i++)
{
int j = i - 1;
while(nums[i] == nums[j] && j >= 0)
{
j--; minNum++;
}
}
}
cout << minNum <<' ' << maxNum << endl;
}
return 0;
}

京公网安备 11010502036488号