《LeetCode之每日一题》:38.哪种连续子字符串更长
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:38.哪种连续子字符串更长相关的知识,希望对你有一定的参考价值。
题目链接: 哪种连续子字符串更长
有关题目
给你一个二进制字符串 s 。
如果字符串中由 1 组成的 最长 连续子字符串 严格长于 由 0 组成的 最长 连续子字符串,返回 true ;否则,返回 false 。
例如,s = "110100010" 中,由 1 组成的最长连续子字符串的长度是 2 ,由 0 组成的最长连续子字符串的长度是 3 。
注意,如果字符串中不存在 0 ,此时认为由 0 组成的最长连续子字符串的长度是 0 。字符串中不存在 1 的情况也适用此规则。
示例 1:
输入:s = "1101"
输出:true
解释:
由 1 组成的最长连续子字符串的长度是 2:"1101"
由 0 组成的最长连续子字符串的长度是 1:"1101"
由 1 组成的子字符串更长,故返回 true 。
示例 2:
输入:s = "111000"
输出:false
解释:
由 1 组成的最长连续子字符串的长度是 3:"111000"
由 0 组成的最长连续子字符串的长度是 3:"111000"
由 1 组成的子字符串不比由 0 组成的子字符串长,故返回 false 。
示例 3:
输入:s = "110100010"
输出:false
解释:
由 1 组成的最长连续子字符串的长度是 2:"110100010"
由 0 组成的最长连续子字符串的长度是 3:"110100010"
由 1 组成的子字符串不比由 0 组成的子字符串长,故返回 false 。
提示:
1 <= s.length <= 100
s[i] 不是 '0' 就是 '1'
题解
1、一次遍历
思路:
维护两个最大值分别是'1'所构成的最大连续字符串的长度mx1,另外一个为mx0
之后我们要有维护上一个字符prev与当前连续子串的最长长度 cnt
代码一:
class Solution {
public:
bool checkZeroOnes(string s) {
int mx0 = 0;
int mx1 = 0;
char prev = '#';//上一个字符
int cnt = 0;
for (char ch : s)
{
//当前字符跟上个字符是否相等
if (ch == prev)
cnt++;
else
{
if (prev == '0')
mx0 = max (mx0, cnt);
else
mx1 = max(mx1,cnt);
cnt = 1;
}
prev = ch;
}
//判断字符串结尾的连续字符串
if (prev == '0')
mx0 = max (mx0 ,cnt);
else
mx1 = max (mx1,cnt);
return mx1 > mx0;
}
};
代码二:
class Solution {
public:
bool checkZeroOnes(string s) {
int mx0 = 0;
int mx1 = 0;
for (int i = 0; i < s.size(); i++)
{
int cnt = 1;
while(i + cnt < s.size() && s[i + cnt] == s[i + cnt - 1])
cnt++;
if (s[i + cnt - 1] == '0')
mx0 = max(mx0,cnt);
else
mx1 = max(mx1,cnt);
cnt = 1;
}
return mx1 > mx0;
}
};
以上是关于《LeetCode之每日一题》:38.哪种连续子字符串更长的主要内容,如果未能解决你的问题,请参考以下文章
《LeetCode之每日一题》:239.最大连续 1 的个数