前言说明
算法学习,日常刷题记录。
题目连接
题目内容
给你一个二进制字符串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组成的最长连续子字符串的长度,以及由0组成的最长连续子字符串的长度,然后比较两者的长度,即可得到结果。
计算连续子字符串的长度时,和前一个字符进行比较,若相同则连续子字符串还在继续,长度加1,若不相同则连续子字符串重新开始,长度设为1。
所以只需要遍历一次字符串的字符,就可以计算出由1组成的最长连续子字符串的长度,以及由0组成的最长连续子字符串的长度,最后比较两者的长度就可以得出结果。
解答代码
class Solution {
public boolean checkZeroOnes(String s) {
// 定义最长1的长度
int maxOneLength = 0;
// 定义最长0的长度
int maxZeroLength = 0;
// 定义当前1的长度
int currentOneLength = 0;
// 定义当前0的长度
int currentZeroLength = 0;
// 遍历字符串s的字符
for (int i = 0; i < s.length(); ++i) {
if (s.charAt(i) == '1') {
// 若字符为1,先把当前0的长度设为0
currentZeroLength = 0;
if (i > 0 && s.charAt(i - 1) == '1') {
// 若不是第一个字符并且这个字符的前一个字符是1,那么连续子字符串1还在继续,所以当前1的长度加1
++currentOneLength;
} else {
// 若是第一个字符或者不是第一个字符但前一个字符不是1,那么连续子字符串1重新开始,所以当前1的长度设为1
currentOneLength = 1;
}
// 比较最长1的长度和当前1的长度,更新最长1的长度
if (maxOneLength < currentOneLength) {
maxOneLength = currentOneLength;
}
} else {
// 若字符为0,先把当前1的长度设为0
currentOneLength = 0;
if (i > 0 && s.charAt(i - 1) == '0') {
// 若不是第一个字符并且这个字符的前一个字符是0,那么连续子字符串0还在继续,所以当前1的长度加1
++currentZeroLength;
} else {
// 若是第一个字符或者不是第一个字符但前一个字符不是0,那么连续子字符串0重新开始,所以当前0的长度设为1
currentZeroLength = 1;
}
// 比较最长0的长度和当前0的长度,更新最长0的长度
if (maxZeroLength < currentZeroLength) {
maxZeroLength = currentZeroLength;
}
}
}
// 若最长1的长度大于最长0的长度,返回true,否则返回false
return maxOneLength > maxZeroLength;
}
}
提交结果
执行用时1ms,时间击败98.21%的用户,内存消耗36.6MB,空间击败42.43%的用户。
原文链接
原文链接:https://mp.weixin.qq.com/s/iWHiptK5JWckdv8PqB_zvw