15数字华容道解法 图解_Leetcode-探索字节跳动(官方题库)-字符串-思路与解法分析(持续更新)...

b682e0a182056305292dfcb896471240.png

Leetcode-探索字节跳动官方网址:

探索字节跳动 - 力扣 (LeetCode)​leetcode-cn.com
428ae8d21785adadac2080bd55ef7a37.png

数组排序部分传送门:

爱吃咖喱的皮特:Leetcode-探索字节跳动(官方题库)-思路与解法分析-数组与排序(持续更新)​zhuanlan.zhihu.com
b96748dac296637955ed6f6d9afe29d9.png

Leetcode官方提供了许多著名企业官方整理的题目小合集,这些题目由于是官方整理,所以在面试准备中显得极有针对性:既可以按照对应企业的出题考察点提高自己对应的能力也可以快速地找到Leetcode的大量题库中相对价值更高的一些题目(比如某道题特别贴合企业的某些业务场景)。

字节跳动共为面试者整理了38道题,分为6个部分:字符串数组与排序链表与树动态或贪心数据结构拓展练习。今天我就将其中字符串部分的七道题的思路及代码分享给大家

Question 1: Longest Substring Without Repeating Characters(Leetcode-03)

题目描述

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

 示例 1:
 输入: "abcabcbb"
 输出: 3 
 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
     
 示例 2:
 输入: "bbbbb"
 输出: 1
 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
     
 示例 3:
 输入: "pwwkew"
 输出: 3
 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
      请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

思路

滑动窗口法;初始化滑动窗口,长度为1,窗口内容为s.charAt(0);若窗口右侧字母不存在与窗口内,说明窗口可以拓展,则向右拓展;否则不可以拓展,记录下当前窗口大小,并且将窗口向右缩小,即将窗口左侧index加一

代码

 public class Solution {
    
     public int lengthOfLongestSubstring(String s) {
    
        int length = s.length();
         int max = 0;
         int i=0;
         int j=0;
         Set<Character> set = new HashSet<>();
         while(i<length&&j<length){
    
             if(!set.contains(s.charAt(j))){
    
                 set.add(s.charAt(j));
                 j++;
                 max = Math.max(max,j-i);
             }else{
    
                 set.remove(s.charAt(i));
                 i++;
             }
         }
         return max;
     }
 }

Question 2: Longest Common Prefix(Leetcode-14)

题目描述

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""

 示例 1:
 输入: ["flower","flow","flight"]
 输出: "fl"
     
 示例 2:
 输入: ["dog","racecar","car"]
 输出: ""
 解释: 输入不存在公共前缀。

思路

解法1:水平扫描法

对于字符串数组{s1,s2,s3,...sn},我们获得它们的最长公共子串(S(i,j)表示字符串si和sj的最长公共子串)可以依据以下方法:S(1,n)=S(S(S(S(1,2),3),4),...n)。即,先获得s1和s2的最长公共子串,再获得这个最长公共子串与s3的最长公共子串,以此类推。此方法的初始最长公共子串为s1(相当于s1与自己的最长公共子串),然后逐渐长度减小,直到符合全字符串数组。

解法2:垂直扫描法(见下代码)

另外一种方法是,我们不像刚刚的方法一样将最长公共子串由长变短,而是由短变长。我们从0开始迭代,对于每次迭代,我们验证index=i的位置上的所有字符串是否都为同一字符,以此类推,从而得到最长公共子串

解法3:分治法

我们可以采用分治法,即S(1,n) = S(S(1,n/2),S(n/2+1,n)) = ...,直到分到每组只有一个字符串,这样就归结到了简单的最长公共子串的计算了

代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值