牛牛的独特子序列
题目链接
https://ac.nowcoder.com/acm/contest/9752/B
解题思路
abc不一定要连续,但是a与a必须连续,对于b,c同理。
二分;
先把a,b,c选出来,二分题目中的n,check函数先看能不能找到n个a,再看能不能找到n个b,再找n个c,如果任意一个不行,则返回false,否则返回true。
AC代码
int n;
string ss;
bool check(int x)
{
int len=3*x,i=1,cnta=0,cntb=0,cntc=0;
while(i<=n)
{
if(ss[i]=='a') cnta++;
i++;
if(cnta==x) break;
}
while(i<=n)
{
if(ss[i]=='b') cntb++;
i++;
if(cntb==x) break;
}
while(i<=n)
{
if(ss[i]=='c') cntc++;
i++;
if(cntc==x) break;
}
if(cnta+cntb+cntc>=len) return true;
else return false;
}
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param x string字符串
* @return int整型
*/
int Maximumlength(string s) {
// write code here
ss+='.';
for(int i=0;i<s.size();i++)
if(s[i]=='a' || s[i]=='b' || s[i]=='c') ss+=s[i];
n=ss.size();
int l=0,r=n;
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
return l*3;
}
};总结
没做出来;
顺着模拟,发现思路又错了,忽略了很多特殊情况,我好菜啊。这里的子序列就不能说明一下吗
思维 文章被收录于专栏
思维题都会了,ACM金牌就稳了! 我骗你的!

