面试真题:无重复字符的最长子串

简介: 来一个算法题,面试之后查了一下,是 LeetCode 的第三题,难度中等。居然在面试过程中碰到 LeetCode 真题,事后总结一波。加深印象。

image.png

你好,我是看山。


来一个算法题,面试之后查了一下,是 LeetCode 的第三题,难度中等。居然在面试过程中碰到 LeetCode 真题,事后总结一波。加深印象。


先看一下题目描述:


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


输入:s = “abcabcbb”

输出:3

解释:因为无重复字符的最长子串是 “abc”,所以其长度为 3。


输入:s = “pwwkew”

输出:3

解释:因为无重复字符的最长子串是 “wke”,所以其长度为 3。


请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。


看过题目之后,我最先想到的是一道数学题:一个线段上有 10 个点,求总共有多少的线段?如果是小朋友解题的话,一般就是,左手固定,右手向右移动,每移动一个点就加一个数,右手移动到末尾后,左手向右移动一个点,以此类推,知道最后一个点。这样就能够数出所有的线段数量,而且还不会乱。


其实上面这个算法题和我说的这个数学题的解法类似,采用小学生解法,只不过需要在数数的时候加一些判断,比如,线段中的点,有没有相同的。


来个图例:

image.png



根据图例写代码:


import java.util.HashSet;
import java.util.Set;
class Solution {
    public static int lengthOfLongestSubstring(String s) {
        if (s == null || s.isEmpty()) {
            return 0;
        }
        final int len = s.length();
        final Set<Character> sets = new HashSet<>();
        int i = 0, j = 0, result = 0;
        Character tmp ;
        while (i < len && j < len) {
            tmp = s.charAt(j);
            if (sets.contains(tmp)) {
                sets.remove(s.charAt(i++));
            } else {
                sets.add(tmp);
                result = Math.max(result, j++ - i + 1);
            }
        }
        return result;
    }
}

如果是面试,这个时候就可以交差了。既然是总结,就得再想一下这个解法有没有通用性。我们所采用的办法是,通过两个变量 i 和 j 指向计算元素,然后与 i 与 j 之间的元素进行判断,这种方式江湖称之为“双指针”。贴心的 LeetCode 也给过定义:


双指针从广义上来说,是指用两个变量在线性结构上遍历而解决的问题。狭义上说,


对于数组,指两个变量在数组上相向移动解决的问题;

对于链表,指两个变量在链表上同向移动解决的问题,也称为「快慢指针」问题。

双指针算法通常不难,是基于暴力解法的优化,它们是很好的学习算法的入门问题。


从 这里 可以找到所有 LeetCode 中关于双指针解法的题目,可以过足瘾。

目录
相关文章
|
6月前
|
存储 算法 程序员
【Leetcode 程序员面试金典 01.01】判定字符是否唯一 —— 位运算|哈希表
可以使用哈希表或位运算来解决此问题:由题可知s[i]仅包含小写字母,int[26]即能表示字符的出现次数;
|
算法 程序员
【Leetcode】NC31 第一个只出现一次的字符(牛客网)、面试题 01.01. 判定字符是否唯一
题目描述: 描述 在一个长为n字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
69 0
|
6月前
|
算法
面试题 01.01:判定字符是否唯一
面试题 01.01:判定字符是否唯一
39 0
|
6月前
剑指Offer LeetCode 面试题50. 第一个只出现一次的字符
剑指Offer LeetCode 面试题50. 第一个只出现一次的字符
34 0
|
Java 数据处理
Java IO(File、字节输入输出流、字符输入输出流、打印流)附带相关面试题
1.File类,2.字节输入输出流(InputStream Outputstream),3.Writer与Reader字符输入输出流,4.打印流
88 0
|
编译器 C语言 C++
C语言面试题 - 字符空间操作类
C语言面试题 - 字符空间操作类
84 0
|
Serverless C语言 索引
华为面试C语言真题(二)
华为面试C语言真题( 二)
309 1
华为面试C语言真题(二)
|
安全 测试技术 Python
软件测试面试题及答案,这个题库有3千多道最新面试真题可以刷
相信对于很多软件测试新手来说,技术项目的面试是十分让人头疼的,生怕没回答得好,就会跟这个offer失之交臂
205 0
|
设计模式 缓存 算法
腾讯Java高级岗180道面试真题,面试大厂拿45Koffer没问题!
一、数据结构与算法基础 · 说一下几种常见的排序算法和分别的复杂度。 · 用Java写一个冒泡排序算法 · 描述一下链式存储结构。 · 如何遍历一棵二叉树? · 倒排一个LinkedList。 · 用Java写一个递归遍历目录下面的所有文件
|
算法 索引
【Day15】算法刷题(解题思路+详细注释)[面试题 17.09. 第 k 个数 ][424. 替换后的最长重复字符 ][438. 找到字符串中所有字母异位词 ]
了解[面试题 17.09. 第 k 个数 ][424. 替换后的最长重复字符 ][438. 找到字符串中所有字母异位词 ]。
172 0
【Day15】算法刷题(解题思路+详细注释)[面试题 17.09. 第 k 个数 ][424. 替换后的最长重复字符 ][438. 找到字符串中所有字母异位词 ]
下一篇
无影云桌面