3道编程题
1.
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
求原字符串和其反串的最大公共子序列(不是子串,因为可以不连续)的长度(使用动态规划很容易求得),然后用原字符串的长度减去这个最大公共子串的长度就得到了最小编辑长度。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
string reverse(string s){
int l = 0 , r = s.length() - 1;
while(l < r){
s[l]^=s[r];
s[r]^=s[l];
s[l]^=s[r];
l++;
r--;
}
return s;
}
int common(string s,string t){
int len = s.length();
int dp[len+1][len+1];
for(int i = 0; i <= len; i++){
for(int j = 0; j <= len; j++){
dp[i][j]=0;
}
}
for(int i = 1; i <= len; i++){
for(int j = 1; j <= len; j++){
if(s[i-1] == t[j-1]) {
dp[i][j] = dp[i - 1][j -1] + 1;
} else{
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[len][len];
}
int main(){
string s,t;
int commonlen = 0;
while(cin>>s){
int len = s.length();
t=reverse(s);
commonlen = common(s,t);
cout << len - commonlen << endl;
}
return 0;
}
2.
小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
你能帮帮小Q吗
直接输出的 233333
3.小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
主要就是需要考虑重复的情况
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <vector>
using namespace std;
int main(){
int n;
while(cin >> n){
if(n < 2) {
cout << 0 << " " << 0 <<endl;
continue;
}
if(n == 2){
cout << 1 << " " << 1 <<endl;
continue;
}
vector<int> vc;
int data;
for(int i = 0; i < n; i++){
cin >> data;
vc.push_back(data);
}
sort(vc.begin(),vc.end());
int diff = vc[1] - vc[0];
for(int i = 2; i < n; i++){
int tmp = vc[i] - vc[i - 1];
diff = min(diff,tmp);
}
int smallcnt = 0;
if(diff == 0){
int cnt = 1;
for(int i = 1; i < n; i++){
for(int j = 0; j < i; j++){
if(vc[j] == vc[i]){
smallcnt++;
}
}
}
} else {
for(int i = 1; i < n; i++){
if((vc[i] - vc[i - 1]) == diff) smallcnt++;
}
}
int lcnt = 1;
int rcnt = 1;
for(int i = 1; i < n; i++){
if(vc[i] == vc[0]) lcnt++;
else break;
}
for(int i = n - 2 ;i >=0; i--){
if(vc[i] == vc[n - 1]) rcnt++;
else break;
}
int bigcnt = 0;
if(vc[n-1] == vc[0]) {
bigcnt = smallcnt;
} else {
bigcnt = lcnt * rcnt;
}
cout << smallcnt << " " << bigcnt << endl;
}
return 0;
}