日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Leetcode5634. 删除子字符串的最大得分[C++题解]:贪心

發布時間:2025/4/5 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode5634. 删除子字符串的最大得分[C++题解]:贪心 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 題目
    • 題目鏈接

題目

樣例

字符串可以分成很多段,[ ab的組合]、其他字母、[ab的組合]、其他字母這樣很多段,樣例就是 cd[b]c[bbaaabab]可以拆成ab的組合和其他字母。

對于某一段[ab的組合],需要計數a和b的個數:分別記為A和B。比如[abbaaba]其中a的個數A=4,b的個數B=3. 這一段可以操作的數量是min(A,B)=3次,這里的每次操作消耗掉一個a和一個b。而且只要有相鄰的a和b就可以操作。

這里我們假定ab的得分大于等于ba的得分,即x≥y。(可以省去一半的思考時間),那么想要得分最大,就需要 刪除ab的操作盡可能多。

最多可以刪除多少個ab呢?

可以貪心來做。某個位置的a,能否和b配對,取決于其后面是否有b。如果和b相鄰那么自然可以配對。我們從后往前遍歷,計數b的數量(相當于放在后備箱),往前掃的過程中每遇到一個a,就從后備箱拿出一個b,計數器減1.代表成功配對1個ab。如果后備箱中沒有b,這個a就不能配成ab。

這樣遍歷完之后,最大的ab個數就確定了,而總的操作次數是min(A,B),則操作ba的個數就是min(A,B)-ab個數.然后分別乘以得分x和y即為最大得分。

ac代碼

class Solution { public:int maximumGain(string s, int x, int y) {//假定x≥yif(x<y){swap(x,y);for(auto& c:s){if(c=='a') c='b';else if(c=='b') c='a';}}int res=0;for(int i=0; i< s.size();i++){ //用i和j來指明某一段[i,j)左閉右開if(s[i]!='a' && s[i]!='b') continue;int j=i;while(j<s.size() && ( s[j]=='a'|| s[j]=='b')) j++;//執行這一步之后j一定在i后面int a=0,b=0,c=0, remain=0;//remain表示后備箱中b的數量//c表示找出來ab的數量for(int k = j-1; k>= i; k --){ //具體的一段的處理if(s[k]=='a'){a++;if(remain) { //后備箱中還有bremain--;c++;}}else {//s[k]=='b'b++;remain++;}}res+=c*x+ (min(a,b)-c)*y;//加號后面表示"ba"的數量×分數yi=j; //這一段結束,遍歷下一段}return res;} };

題目鏈接

Leetcode5634. 刪除子字符串的最大得分

總結

以上是生活随笔為你收集整理的Leetcode5634. 删除子字符串的最大得分[C++题解]:贪心的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。