天池在线编程 2020年9月26日 日常周赛题解
生活随笔
收集整理的這篇文章主要介紹了
天池在线编程 2020年9月26日 日常周赛题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. K步編輯
- 2. 折紙
- 3. 字符串的不同排列
- 4. 硬幣排成線
題目地址,請點這
1. K步編輯
給出一個只含有小寫字母的字符串的集合以及一個目標串(target),輸出所有可以經過不多于 k 次操作得到目標字符串的字符串。
你可以對字符串進行一下的3種操作:
- 加入1個字母
- 刪除1個字母
- 替換1個字母
考查動態規劃:最短編輯距離
class Solution { public:/*** @param words: a set of stirngs* @param target: a target string* @param k: An integer* @return: output all the strings that meet the requirements*/vector<string> kDistance(vector<string> &words, string &target, int k) {// write your code herevector<string> ans;for(auto& w : words){if(minDistance(w, target) <= k)ans.push_back(w);}return ans;}int minDistance(string word1, string word2) {int n1 = word1.size(), n2 = word2.size(), i, j;if(n1==0 || n2==0) return max(n1,n2);int dp[n1+1][n2+1];for(i = 0; i < n1+1; i++)dp[i][0] = i;for(j = 0; j < n2+1; j++)dp[0][j] = j;// DPint left, up, left_up;for(i = 1; i < n1+1; i++) {for(j = 1; j < n2+1; j++) {left = dp[i-1][j];up = dp[i][j-1];left_up = dp[i-1][j-1];if(word1[i-1] != word2[j-1]) dp[i][j] = 1 + min(left, min(up, left_up));else// word1[i-1] == word2[j-1]dp[i][j] = left_up;}}return dp[n1][n2];} };2. 折紙
折紙,每次都是將紙從右向左對折,凹痕為 0,凸痕為 1,求折 n 次后,將紙展開所得折痕組成的 01 序列。
1<=n<=201<=n<=201<=n<=20
- 找規律,拿張紙,折幾次就會發現規律了。下一個序列是在前一個序列的基礎上插空加入010101...
3. 字符串的不同排列
給出一個字符串,找到它的所有排列,注意同一個字符串不要打印兩次。 請以字典序從小到大輸出。 0<=n<=20
排列組合,回溯+剪枝
class Solution { public:/*** @param str: A string* @return: all permutations*/vector<string> ans;vector<string> stringPermutation(string &str) {// write your code heresort(str.begin(), str.end());vector<bool> vis(str.size(), false);string s;dfs(str, s, 0, vis);return ans;}void dfs(string &str, string &s, int idx, vector<bool> &vis){if(idx == str.size()){ans.push_back(s);return;}for(int i = 0; i < str.size(); i++){if(vis[i])continue;if(i >= 1 && !vis[i-1] && str[i-1] == str[i])continue;//剪枝,去重s += str[i];vis[i] = true;dfs(str, s, idx+1, vis);vis[i] = false;s.pop_back();}} };4. 硬幣排成線
有 n 個硬幣排成一條線, 第 i 枚硬幣的價值為 values[i].
兩個參賽者輪流從任意一邊取一枚硬幣, 直到沒有硬幣為止. 拿到硬幣總價值更高的獲勝.
請判定 第一個玩家 會贏還是會輸. 1<=n<=20001<=n<=20001<=n<=2000
- 博弈 動態規劃,dp[i][j] 表示剩余硬幣為 [i,j] 時,我跟對手的最大差值
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的天池在线编程 2020年9月26日 日常周赛题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode MySQL 1205.
- 下一篇: LeetCode 1743. 从相邻元素