刷题打卡,第 二十 天
题目一、1784. 检查二进制字符串字段
原题链接:1784. 检查二进制字符串字段
题目描述
:
给你一个二进制字符串
s
,该字符串 不含前导零 。
如果s
包含 零个或一个由连续的'1'
组成的字段 ,返回true
。否则,返回false
。
如果s
中 由连续若干个'1'
组成的字段 数量不超过1
,返回true
。否则,返回false
。
/
示例 1:
输入:s = “1001”
输出:false
解释:由连续若干个 ‘1’ 组成的字段数量为 2,返回 false
/
示例 2:
输入:s = “110”
输出:true
解题思路
:
根据题目的要求,我们可以首先将比较特别的情况给处理掉:
当二进制字符串s
全部由’1‘或全部由’0‘组成,都满足要求,可以直接返回true。
接下来就是比较棘手的问题了,我们需要确定,字符串中包含一个由连续的 '1'
组成的字段,这里面的难点就是,连续若干个 '1'
组成的字段 数量不可以超过 1
。
为了得到二进制字符串s
中,由连续若干个 '1'
组成的字段的数量,我们需要使用滑动窗口的思想,同时还需要获取字符串中字符’1‘的个数来充当辅助。
为什么要这么做呢…我们来讲述一下规律吧:
使用一个长度为2的滑动窗口来遍历字符串,当滑动窗口中的字符串为“11”的时候,就记录下来:
滑动窗口“11”出现的总数用pair表示;
我们还需要遍历字符串的每个字符,记录当中字符’1‘出现的次数:
二进制字符串中“1”的总数,用n来表示;
由连续若干个 ‘1’ 组成的字段的数量等于1时:n - pair = 1
;
由连续若干个 ‘1’ 组成的字段的数量等于2时:n - pair = 2
;
由连续若干个 ‘1’ 组成的字段的数量等于3时:n - pair = 3
;
…
由连续若干个 ‘1’ 组成的字段的数量等于k时:n - pair = k
;
遍历完二进制字符串 s , 只有n - pair = 1
时,我们返回true
。
提交代码
:
class Solution {
public boolean checkOnesSegment(String s) {
//如果字符串中不出现‘1’或不出现‘0’,返回true
//因为字符串包含 零个或一个由连续的 '1' 组成的字段
//且由连续若干个 '1' 组成的字段 数量不超过 1
if(!s.contains("1") || !s.contains("0")) return true;
//获取二进制字段的长度
int n = s.length();
//记录由连续的 '1' 组成的字段 的数量
int sum = 0;
for(int i = 0;i < n;++i){ //遍历二进制字段
char a = s.charAt(i);
if(a == '1') //遍历到'1'
++sum; //记录其出现的次数
if(i+1 < n){ //若长度为2的滑动窗口中是"11",
if(a == '1' && s.charAt(i+1) == '1')
--sum; //记录-1
}
}
//由连续若干个 '1' 组成的字段 数量为 1,返回true,否则返回false
return sum == 1;
}
}
提交结果
:
执行速度击败百分百,哈哈。
题目二、14. 最长公共前缀
原题链接:14. 最长公共前缀
题目描述
:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
/
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。
解题思路
:
题目要求返回字符串数组中元素的最长公共前缀,那么我们可以将每一个字符串元素的相同位置字符进行比较:
全部相同则继续向后比较。
字符串相同位置的字符不等,返回最长公共前缀,即前面遍历过的字符串字符。
当某个字符串元素被完全遍历完,说明它就是最长公共前缀。
按照上述思路,问题就解决了。
提交代码
:
class Solution {
public String longestCommonPrefix(String[] strs) {
int n = strs.length; //获取字符串数组长度
if(strs == null || n == 0) return "";//为空或没有元素,返回空字符串
int count = strs[0].length(); //获取首字符串元素的长度
for(int i = 0;i < count;++i){ //遍历字符串数组
char c = strs[0].charAt(i); //记录首字符串元素的各个字符
for(int j = 1;j < n;++j){ //遍历各字符串元素相同位置的字符
//当遇到不相同额字符 或 某个字符串元素被遍历完
if(i == strs[j].length() || strs[j].charAt(i) != c)
//返回当前长度的公共前缀
return strs[0].substring(0, i);
}
}
return strs[0];//如果元素长度为1,直接返回
}
}
提交结果
:
⚽
求关注
⚽ 作者🥇 .29. 🥇 的✔博客主页✔
⚽来刷题
⚽ 记录每日LeetCode✔刷题专栏✔
您的点赞
,收藏
以及关注
是对作者最大的鼓励喔 ~~