算法提升
- 1.牛牛冲钻五
- 1.2 解析
- 2.最长无重复子数组
- 2.1解析
- 3.重排字符串
- 3.1解析
1.牛牛冲钻五
1.2 解析
后面的数据要根据前面两个的状态来确定,我的做法是使用动态规划的方式
#include<iostream>
#include<string>
#include<vector>
using namespace std;int main()
{//1.输入int T=0;cin>>T;while(T--){int n=0,k=0;cin>>n>>k;string s;cin>>s;//2.代码vector<int> dp(n);//初始化if(s[0]=='W')dp[0]=1;elsedp[0]=-1;if(s[1]=='W')dp[1]=dp[0]+1;else dp[1]=dp[0]-1;//填表for(int i=2;i<n;i++){if(s[i]=='L')dp[i]=dp[i-1]-1;else{if(s[i-1]=='W'&&s[i-2]=='W')dp[i]=dp[i-1]+k;elsedp[i]=dp[i-1]+1;}}printf("%d\n",dp[n-1]);}return 0;
}
2.最长无重复子数组
2.1解析
非常经典的滑动窗口的题目
使用hash表存储已经进入窗口内的值,如果出现重复元素,就出窗口然后再统计结果’
#include <unordered_map>
class Solution
{
public:int maxLength(vector<int>& arr) {unordered_map<int, int> hash;int n=arr.size();int ret=1,left=0,right=0;while(right<n){//1.进hash[arr[right]]++;//2.判断+出while(hash[arr[right]]>1){hash[arr[left]]--;left++;}//3.更新结果ret=max(ret,right-left+1);right++;}return ret;}
};
3.重排字符串
3.1解析
今天最有难度的题目,整体思路使用贪心
//1.每次处理一批相同的字母
//2.优先处理出现次数最多的字母
//3.每次摆放中间隔一个位置
//判断是否可以重拍,x<=(n+1)/2
//贪心
//1.每次处理一批相同的字母
//2.优先处理出现次数最多的字母
//3.每次摆放中间隔一个位置
//判断是否可以重拍,x<=(n+1)/2
class Solution
{
public:string rearrangestring(string s) {int n = s.size();vector<int> cnt(26, 0); // 初始化计数数组为0char max_char = 'a'; // 出现次数最多的字符int max_count = 0; // 最多字符的次数// 统计字符频率并找最大值for (char c : s) {int idx = c - 'a'; // 修正:字符转0-25索引if (++cnt[idx] > max_count) {max_count = cnt[idx];max_char = c;}}// 无法重排的情况:最多字符超过 (n+1)/2if (max_count > (n + 1) / 2) return "";string ret(n, ' '); // 初始化结果字符串为n长度int i = 0;// 优先放置最多字符(间隔放置)while (max_count--) {ret[i] = max_char;i += 2; // 偶数位置:0,2,4...}// 处理剩余字符for (int j = 0; j < 26; ++j) {char c = 'a' + j;if (c == max_char || cnt[j] == 0) continue;while (cnt[j]--) {if (i >= n) i = 1; // 偶数位置填满后用奇数位置:1,3,5...ret[i] = c;i += 2;}}return ret;}
};