目录
1.牛牛冲钻五
2.最长无重复子数组_牛客题霸_牛客网
3.重排字符串
1.牛牛冲钻五
算法思路:
特别简单的模拟题,没什么说的。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{ int t = 0;cin >> t;while(t){int n ,k ;cin >> n >> k;string s;cin >> s;int ret = 0;int cnt = 0;for(int i = 0; i < n; i++){if(s[i] == 'W'){cnt++;if(cnt >= 3){ret += k;}else{ret += 1;}}else{cnt = 0;ret -= 1;} }cout << ret << endl;t--;}return 0;
}
2.最长无重复子数组_牛客题霸_牛客网
算法思路:
这是一道滑动窗口的题目,只需分析好,什么时候入窗口,什么时候出窗口,什么时候更新返回值。
维护一个窗口,窗口内的元素不会重复,一定会用到哈希表。
入窗口:hash[right]++,将当前元素存储到哈希表中。
出窗口:hash[left]--,将当前元素存从哈希表中删除,直到窗口内没有重复元素。
class Solution {
public:int maxLength(vector<int>& arr) {unordered_map<int,int> map;int left = 0, right = 0;int ret = 0;for(right; right < arr.size(); right++){map[arr[right]]++;//入窗口while(map[arr[right]] > 1 && left < right)//出窗口{map[arr[left]]--;left++;}ret = max(ret, right - left + 1);//维护返回值} return ret;}
};
3.重排字符串
算法思路:
1.判断字符串是否能重排
一定要想到 出现次数最多的字符,如果一个字符出现次数超过一个临界值,就无法进行重排。
将字符串分为,出现最多的字符,和其他字符,将出现最多的字符和其他字符,两个组成一组,这样不就能保证,无相邻的相同字符。
举例: abbcccc
ca cb cb c:找规律发现,只要出现最多的字符 <=(n + 1)/ 2 ,那么就能重排
2.重排
先将出现最多的字符,间隔放置 ,c_ c_ c_c,再将其他字符填入空中
#include <iostream>
#include <string>using std::string;
using std::cout;
using std::endl;
using std::cin;int hash[26] = { 0 }; //记录字母出现的次数
string s;string ret;//返回值
int n = 0;int main()
{cin >> n >> s;char maxChar = 0;//出现最多次数的字符int maxCount = 0;//最多的次数for(int i = 0; i < n; i++){int index = s[i] -'a';if(++hash[index] > maxCount){maxChar = s[i];maxCount = hash[index];}}if(maxCount > (n + 1) / 2){cout << "no" << endl;}else{cout << "yes" << endl;ret.resize(n);int index = 0;while(maxCount--)// 处理出现最多次的字符{ret[index] = maxChar;index += 2;}for(int i = 0; i <26 ; i++)//处理其他字符{if(hash[i] && i + 'a' != maxChar){while(hash[i]--){if(index >= n){index = 1;}ret[index] = i + 'a';index += 2;}}}cout << ret << endl;} return 0;
}