牛客 牛牛的独特子序列(双指针/二分查找)
生活随笔
收集整理的這篇文章主要介紹了
牛客 牛牛的独特子序列(双指针/二分查找)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 雙指針
- 2.2 二分查找
1. 題目
鏈接:https://ac.nowcoder.com/acm/contest/9752/B
來源:牛客網(wǎng)
牛牛現(xiàn)在有一個長度為len只包含小寫字母‘a(chǎn)’-'z’的字符串x,他現(xiàn)在想要一個特殊的子序列,
這個子序列的長度為3*n(n為非負整數(shù)),
子序列的第[1,n]個字母全部為‘a(chǎn)’,
子序列的[n+1,2*n]個字母全部為‘b’,
子序列的[2*n+1,3*n]個字母全部為‘c’,
牛牛想知道最長的符合條件的獨特子序列的長度是多少。
2. 解題
2.1 雙指針
class Solution { public:/*** 代碼中的類名、方法名、參數(shù)名已經(jīng)指定,請勿修改,直接返回方法規(guī)定的值即可* * @param x string字符串 * @return int整型*/// typedef pair<int,int> pii;int Maximumlength(string x) {// write code herestring s;for(auto c : x)if(c=='a' || c=='b' || c=='c')s += c; //只需要abc字符int n = s.size();if(n < 3) return 0;vector<int> numa(n+1, 0), numb(n+1, 0), numc(n+1, 0);//前綴和個數(shù)for(int i = 1; i <= n; i++){if(s[i-1] == 'a'){numa[i] = numa[i-1] + 1;numb[i] = numb[i-1];numc[i] = numc[i-1];}else if(s[i-1] == 'b'){numa[i] = numa[i-1];numb[i] = numb[i-1]+1;numc[i] = numc[i-1];}else{numa[i] = numa[i-1];numb[i] = numb[i-1];numc[i] = numc[i-1]+1;}}int ans = 0, a = 0, b= 0, c= 0;int i = 1, j = n;// 貪心,讓 a c,交替變多while(i <= j){int MIN = min(a,min(b,c));//數(shù)量最少的if(MIN == a){a = numa[i++];}else if(MIN == c){c = numc[n]-numc[--j];}elsebreak;b = numb[j]-numb[i-1];ans = max(ans, 3*min(a,min(b,c)));}return ans;} };2.2 二分查找
通用解法
class Solution { public:/*** 代碼中的類名、方法名、參數(shù)名已經(jīng)指定,請勿修改,直接返回方法規(guī)定的值即可* * @param x string字符串 * @return int整型*/// typedef pair<int,int> pii;int Maximumlength(string x) {// write code herestring s;for(auto c : x)if(c=='a' || c=='b' || c=='c')s += c;int n = s.size();if(n < 3) return 0;int l = 0, r = n/3, mid, ans = 0;while(l <= r){mid = (l+r)/2;if(ok(s, mid)){ans = mid*3;l = mid+1;}elser = mid-1;}return ans;}bool ok(string& s, int n){int a = 0, b =0, c = 0;for(int i = 0; i < s.size(); ++i){if(a < n){if(s[i] == 'a')a++;}else if(b < n){if(s[i]== 'b')b++;}else{if(s[i] == 'c')c++;}}return c >= n;} };我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結(jié)
以上是生活随笔為你收集整理的牛客 牛牛的独特子序列(双指针/二分查找)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1216. 验证回文字
- 下一篇: 04.卷积神经网络 W1.卷积神经网络