Leetcode-探索字节跳动官方网址:
探索字节跳动 - 力扣 (LeetCode)leetcode-cn.com数组排序部分传送门:
爱吃咖喱的皮特:Leetcode-探索字节跳动(官方题库)-思路与解法分析-数组与排序(持续更新)zhuanlan.zhihu.comLeetcode官方提供了许多著名企业官方整理的题目小合集,这些题目由于是官方整理,所以在面试准备中显得极有针对性:既可以按照对应企业的出题考察点提高自己对应的能力,也可以快速地找到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)) = ...,直到分到每组只有一个字符串,这样就归结到了简单的最长公共子串的计算了