題目一:
給定一個字符串s,你可以從中刪除一些字符,使得剩下的串是一個迴文串。如何刪除才能使得迴文串最長呢?
輸出需要刪除的字符個數。
輸出需要刪除的字符個數。
輸入描述:
輸入數據有多組,每組包含一個字符串s,且保證:1<=s.length<=1000.
輸出描述:
對於每組數據,輸出一個整數,代表最少需要刪除的字符個數。
解題思路:
先reverse求字符串的反串,然後求正反兩字符串的最長公共子序列,要刪除的字符個數就是總長度減去最長公共子序列的長度。
具體實現:
#include<bits/stdc++.h>
using namespace std;
int min_deleteNum(string s1){
int len = s1.length();
int temp[len+1][len+1];
string s2(s1);
reverse(s2.begin(), s2.end());
memset(temp, 0, sizeof(temp));
for(int i = 0; i < s1.length(); ++i){
for(int j = 0; j < s2.length(); ++j){
if(s1[i] == s2[j]){
temp[i+1][j+1] = temp[i][j] + 1;
}else{
temp[i+1][j+1] = max(temp[i][j+1], temp[i+1][j]);
}
}
}
return len-temp[len][len];
}
int main(){
string str;
while(cin >> str){
cout << min_deleteNum(str) << endl;
}
return 0;
}
題目二:
小Q最近遇到了一個難題:把一個字符串的大寫字母放到字符串的後面,各個字符的相對位置不變,且不能申請額外的空間。
你能幫幫小Q嗎?
輸入描述:
輸入數據有多組,每組包含一個字符串s,且保證:1<=s.length<=1000.
輸出描述:
對於每組數據,輸出移位後的字符串。
輸入例子:
AkleBiCeilD
輸出例子:
kleieilABCD
解題思路:
題目要求不能申請額外的空間,所以要在字符串上進行操作,從後向前處理。
用兩個“指針”,一個指針i始終指向已處理過得字串之首(初始位於字符串末尾後面一個位置),另一個指針j前進,當遇到大寫字母時停下進行如下操作:i指針前進1,用temp字符保存下這個大寫字母,然後用循環將j-i之間的小寫字母都前移一位,最後將s[i]置爲保存的大寫字母。
這裏用了判斷是否爲大寫字母的函數:isupper()
具體實現:
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
while (cin >> s){
int i = s.length() ;
int j = i -1;
while (j >= 0){
if (isupper(s[j])){
char temp = s[j];
int t = j;
i--;
while (t < i){//將j-i間的小寫字母前移
s[t] = s[t+1];
t++;
}
s[i] = temp;
}
j--;
}
cout << s << endl;
}
return 0;
}
題目三:
小Q今天在上廁所時想到了這個問題:有n個數,兩兩組成二元組,相差最小的有多少對呢?相差最大呢?
解題思路:
先將數組排序。
求相差最大的對數:特殊情況是所有數字相等,此時單獨計算; 普通情況就算最大值有多少個相等的,最小值有多少個相等的,然後兩個數相乘;
求相差最小的對數:首先求出最小相差多少。如果爲0,則計算有多少個相等的數字對;如果不爲0,則遍歷數組求出相鄰兩個數有多少對的差等於最小差值。
具體實現:
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin >> n){
vector<int> array(n);
for(int i = 0; i < n; i++){ cin >> array[i]; }
sort(array.begin(), array.end());
int min_num = 0, max_num = 0;
//max number
if(array[0] == array[n-1]){ //如果所有的數字都相等
max_num = n * (n-1) / 2;
}else{
int m1 = 0, m2 = n-1;
int a = 1, b = 1;
while(array[m1+1] == array[m1]){
a++;
m1++;
}
while(array[m2-1] == array[m2]){
b++;
m2--;
}
max_num = a * b;
}
//min number
int tempMin = array[n-1]- array[0];
for(int i = 0; i < n - 1; i++){
if(array[i+1] - array[i] < tempMin){
tempMin = array[i+1] - array[i];
}
}
if(tempMin != 0){ //如果沒有相等的數
for(int i = 0; i < n-1; i++){
if(array[i+1] - array[i] == tempMin){
min_num++;
}
}
}else{//有相等的數字
int i = 0;
while(i < n-1) {
int temp = 1;
int j = i + 1;
while (array[j] == array[i]) {
temp++;
j++;
}
min_num += temp * (temp - 1) / 2;
i = j + 1;
}
}
cout << max_num << " " << min_num << endl;
}
return 0;
}
—————————————————————————————————————————————
加油加油!ヾ(◍°∇°◍)ノ゙編程能力都是練出來的!你也闊以的!