【Day20】LeetCode算法题【1784. 检查二进制字符串字段】【14. 最长公共前缀】

简介: 了解LeetCode算法题【1784. 检查二进制字符串字段】。

刷题打卡,第 二十 天


题目一、1784. 检查二进制字符串字段

题目二、14. 最长公共前缀


题目一、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;          
    }
}

提交结果:


执行速度击败百分百,哈哈。

微信图片_20221030180011.png


题目二、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,直接返回
    }
}

提交结果:

微信图片_20221030180018.png

⚽求关注⚽ 作者🥇 .29. 🥇 的✔博客主页✔

⚽来刷题⚽ 记录每日LeetCode✔刷题专栏✔

您的点赞,收藏以及关注是对作者最大的鼓励喔 ~~

微信图片_20221029111446.jpg




目录
相关文章
|
1月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
算法
Leetcode第十四题(最长公共前缀)
这篇文章介绍了一种算法,用于在给定的字符串数组中找到最长公共前缀,通过逐字符比较每个字符串的对应位置,一旦发现不匹配立即返回当前已匹配的子串作为公共前缀。
130 0
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
137 0
|
8月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
278 4
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
160 2
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
231 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
174 6
LeetCode第14题最长公共前缀
该文章介绍了 LeetCode 第 14 题最长公共前缀的解法,通过取一个字符串作为基准,一列一列字符比较来找出最长公共前缀,时间复杂度为 O(m * n),同时提到也可使用二分查找法,但代码复杂度会上升。
LeetCode第14题最长公共前缀
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
192 2

热门文章

最新文章