文章目录
- 前言
- 1. 牛牛冲钻五
- 1.1 题目描述
- 1.2 解题思路
- 1.3 代码实现
- 2. 最长无重复子数组
- 2.1 题目描述
- 2.2 解题思路
- 2.3 代码实现
- 3. 重排字符串
- 3.1 题目描述
- 3.2 解题思路
- 3.3 代码实现
- 总结
前言
1. 牛牛冲钻五
2. 最长无重复子数组
3. 重排字符串
1. 牛牛冲钻五
1.1 题目描述
1.2 解题思路
使用前缀和思路统计出结束当前对局连胜数量,再根据连胜数量依次加上星星就可以了。
1.3 代码实现
#include <iostream>
using namespace std;
#include <string>
#include <vector>
int main()
{int t = 0; cin >> t;while(t--){int n = 0, k = 0; cin >> n >> k;string s; cin >> s;vector<int> dp(n, 0);dp[0] = s[0] == 'W' ? 1 : 0;// 统计连胜for(int i = 1; i < n; i++){if(s[i] == 'W') dp[i] = dp[i-1] + 1;}int ret = 0;for(int i = 0; i < n; i++){if(s[i] == 'W'){if(dp[i] >= 3) ret += k;else ret += 1;}else{ret -= 1;}}cout << ret << endl;}
}
2. 最长无重复子数组
2.1 题目描述
2.2 解题思路
典型的滑动窗口的问题,使用双指针来维护我们需要的合法区间即可。
2.3 代码实现
class Solution {public:// 滑动窗口int maxLength(vector<int>& nums) {int ret = 0;int n = nums.size();// 维护一段有效区间int left = 0, right = 0;// 判断前面是否出现过这个数字unordered_set<int> hash;while (right < n){while (right < n && hash.count(nums[right]) == 0) {hash.insert(nums[right++]);}ret = max(ret, right - left);while (hash.count(nums[right]) == 1) {hash.erase(nums[left++]);}}return ret;}
};
3. 重排字符串
3.1 题目描述
3.2 解题思路
想要将不同的字符串进行分割,只要出现次数最多的字符没有超过总字符的一半,那么就可以重排成功。因为我们采用的方法是,隔上一个方一个字符,就比如第一个位置放字符a,下一个就到第三个位置放字符a,通过这样的放置方法,来实现所有相同字符的分隔。所以当出现次数最多的字符超过总字符的一半时,那么就无论如何都无法将相同字符进行分隔了,直接返回就行了。
因为我们可以先使用哈希表,统计出每一个字符出现的次数,以及最多出现的次数和最多出现的字符,先放置出现次数最多的字符,防止这种情况:aaabbbb ----> abababb。因此需要先放置出现最多的字符。
3.3 代码实现
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <cstring>
int main()
{int n = 0; cin >> n;string s; cin >> s;int hash[26];memset(hash, 0 ,sizeof hash);int maxCount = 0,maxIndex = 0;for(int i = 0; i < n; i++){int ch = s[i] - 'a';hash[ch]++;if(hash[ch] > maxCount){maxCount = hash[ch];maxIndex = ch;}}if((n + 1) / 2 < maxCount){cout << "no";return 0;}vector<string> ret(n);int cur = 0;while(maxCount--){ret[cur] = maxIndex + 'a';cur += 2;}for(int i = 0; i < 26; i++){if(hash[i] && i != maxIndex){while(hash[i]--){if(cur >= n) cur = 1;ret[cur] = i + 'a';cur += 2;}}}cout << "yes" << endl;for(int i = 0; i < n; i++){cout << ret[i];}return 0;
}
总结
前两个题都是由固定的算法思路,进行专项训练就可以了,至于第三个题那么就只能看个人的想法了。不过多做题肯定是没错的,希望大家可以继续练习下去。
那么第十三天的内容就到此结束了,如果大家发现有什么错误的地方,可以私信或者评论区指出喔。我会继续坚持训练的,希望能与大家共同进步!!!那么本期就到此结束,让我们下期再见!!觉得不错可以点个赞以示鼓励!