算法提升
- 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;}
};