1.構造回文
給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢?
輸出需要刪除的字元個數。
解題思路分析:題意是說問我們最少刪幾個字元能夠使得這個字元變成乙個回文串,這裡需要用到回文串的性質,因為回文串是前後對稱的,所以我們只需要求字串和它的反串的最長公共子串長度即可,最少刪的字元數就是總長度減去最長公共子串長度。求解最長公共子串行長度的方法動態規劃即可,dp[i][j]記錄當我們匹配第乙個字串i位置前面的子串和第二個字串j位置前面的子串的最長公共子串行長度,則有,如果s1[i] == s2[j],則dp[i][j] = dp[i-1][j-1] + 1,否則dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
**;
#include #include #include #include using namespace std;
const int maxn = 1000+5;
char s1[maxn], s2[maxn];
int dp[maxn][maxn];
int main()
pos--;}}
cout << str << endl;
}}
3.有趣的數字
小q今天在上廁所時想到了這個問題:有n個數,兩兩組成二元組,相差最小的有多少對呢?相差最大呢?
解題思路分析:題意是說問我們差最小和最大的二元組有多少對。
首先我們先將所有數進行排序,然後再對所有的數的重複元素去掉,並記錄其出現的次數,顯然差最大值肯定是最大的數減去最小的數,所以差最大的對數就是最大的數的個數乘最小的數的個數。如果出現了重複元素的話那麼最小的差值當然是0,如果沒有出現重複元素的話,那麼我們只需要從這個已經排好序的序列的相鄰元素的差值中去找最小的,因為最小的差值一定是相鄰元素的差,然後我們再通過第二次遍歷便可以找到。
**:
#include #include #include #include #include using namespace std;
const int maxn = 100000 + 5;
int a[maxn], b[maxn];
mapmap;
int main()
sort(a, a+n);
int num = 0;
int ok = 0;
for(int i=0; i1) }}
else
}for(int i=1; i}
}cout << min << " " << max << endl;
}return 0;
}
騰訊2017暑期實習生程式設計題
刷題 pragma warning disable 4996 遮蔽警告 構造回文 題目描述 給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢?輸出需要刪除的字元個數。思路 其實就是,原字串翻轉之後的字串跟原字串的最長公共子串行 那麼利用動態規劃的最長公共...
騰訊2017暑期實習生程式設計題
構造回文串 給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢?輸出需要刪除的字元個數。輸入描述 輸入資料有多組,每組包含乙個字串s,且保證 1 s.length 1000.輸出描述 對於每組資料,輸出乙個整數,代表最少需要刪除的字元個數。示例1 輸入 a...
騰訊2017暑期實習生程式設計題
程式設計題 構造回文 時間限制 1秒 空間限制 32768k 給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢?輸出需要刪除的字元個數。輸入描述 輸入資料有多組,每組包含乙個字串s,且保證 1 s.length 1000.輸出描述 對於每組資料,輸出乙個...