二分法 字首和 最長子序列
牛牛現在有一個長度為len只包含小寫字母‘a’-'z'的字串x,他現在想要一個特殊的子序列,這個子序列的長度為3*n(n為非負整數),子序列的第[1,n]個字母全部為‘a’,子序列的[n+1,2*n]個字母全部為‘b’,子序列的[2*n+1,3*n]個字母全部為‘c’,牛牛想知道最長的符合條件的獨特子序列的長度是多少。
輸入"cbacb" 輸出0
輸入"abaabbcccc" 輸出6
方法一: 二分法
class Solution {
public:
/**
* 程式碼中的類名、方法名、引數名已經指定,請勿修改,直接返回方法規定的值即可
*
* @param x string字串
* @return int整型
*/
bool check(int mid, string x){
int n = x.length();
int a = 0, b = 0, c = 0;
for(int i = 0; i < n; ++i){
if(a < mid){
if(x[i] == 'a'){
++a;
}
}
else if( b < mid){
if(x[i] == 'b'){
++b;
}
}
else if(x[i] == 'c'){
++c;
}
}
return c >= mid;
}
int Maximumlength(string x) {
int n = x.length();
int left = 0, right = n, ans = 0;
while(left <= right){
int mid = (left + right) / 2;
if(check(mid, x)){
ans = mid;
left = mid + 1;
}
else right = mid - 1;
}
return ans * 3;
}
};
方法二:字首和
class Solution {
public:
/**
* 程式碼中的類名、方法名、引數名已經指定,請勿修改,直接返回方法規定的值即可
*
* @param x string字串
* @return int整型
*/
int Maximumlength(string x) {
int n = x.size();
vector<int> a, c;
vector<int> presum (n + 1, 0);
for(int i = 1; i <= n; ++i){
presum[i] = presum[i - 1];
if(x[i - 1] == 'a') a.push_back(i - 1);
if(x[i - 1] == 'b') presum[i]++;
if(x[i - 1] == 'c') c.push_back(i - 1);
}
reverse(c.begin(), c.end());
int ans = 0;
for(int i = 0; i < (int)c.size() && i < (int)a.size(); ++i){
if(c[i] < a[i]) break;
if(presum[c[i] + 1] - presum[a[i]] < i + 1) break;
ans++;
}
return ans * 3;
}
};
相關文章
- 594. 最長和諧子序列
- 最長公共子序列
- 最長上升子序列
- 【LeetCode動態規劃#14】子序列系列題(最長遞增子序列、最長連續遞增序列、最長重複子陣列、最長公共子序列)LeetCode動態規劃陣列
- 最長公共子序列(JAVA)Java
- 最長公共字首
- 線性dp:最長上升子序列
- 線性dp:最長公共子序列
- 最長公共子序列求方案數
- java 實現 最長公共子序列Java
- 死嗑 最長上升子序列(LIS)
- 最長公共子序列 Longest Common Subsequence
- LeetCode 1143.最長公共子序列LeetCode
- 力扣1143. 最長公共子序列 動態規劃之最長公共子序列力扣動態規劃
- NlogN 求最長不下降子序列(LIS)
- 動態規劃:最長上升子序列動態規劃
- LeetCode516. 最長迴文子序列LeetCode
- 最長上升子序列動態規劃動態規劃
- 動態規劃-最長公共子序列動態規劃
- 動態規劃——最長公共子序列動態規劃
- 14_最長公共字首
- 14. 最長公共字首
- 力扣最長公共字首力扣
- 每日leetcode——最長公共字首LeetCode
- LeetCode最長公共字首(Python)LeetCodePython
- 14.最長公共字首
- 最長公共子序列你學會了嗎
- 動態規劃(最長公共子序列LCS)動態規劃
- 動態規劃-最長上升子序列模型動態規劃模型
- 最長公共子序列LCS 輸出所有LCS
- 51Nod 1006 最長公共子序列Lcs
- 【部分轉載】:【lower_bound、upperbound講解、二分查詢、最長上升子序列(LIS)、最長下降子序列模版】
- Day 45 | 300.最長遞增子序列 、674. 最長連續遞增序列 、718. 最長重複子陣列陣列
- 線性dp--最長上升子序列變形
- [題解]P1439 【模板】最長公共子序列
- leetcode14.最長公共字首LeetCode
- 演算法:最長公共字首演算法
- LeeCode 14. 最長公共字首