重温算法之无重复字符的最长子串

简介: 做这类的题目可能最先想到的都是暴力法,直接双层循环,依次比较,但是时间复杂度就高了,如官方题解里借助Hashset的特点去存储元素的话其实更加的简洁明了一些,还是得多看看题解,多学习学习这种思路。

一.题目介绍


1.题目来源


链接:LeetCode


2.题目


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


示例1:

输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc",所以其长度为3。


示例2:

输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是"b",所以其长度为1。


示例3:

输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke",所以其长度为3。


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


二.具体实现


1.实现思路


题目的要求是取出所有无重复子串。如示例1,abc有重复,则结果是abc的字符串长度,而如示例2中只有一个b元素,则其长度为1,依次类推,我们只要通过两次遍历获取,找到重复字符串中最长的那个即可。


2.实现代码


1)自己的实现方式

public int lengthOfLongestSubstring(String s) {
    //开始位置
    int startAt = 0;
    //结束文章
    int endAt = 0;
    //两层循环遍历,依次比较元素,
    for (int i = 0; i < s.length(); i++) {
        int j = i+1;
        如果元素不相同则跳出循环,证明其不存在重复
        for (; j < s.length(); j++) {
            if (s.substring(i, j).indexOf(s.charAt(j)) != -1) { break; }
        }
        int currentMax = j - i;
        int max = endAt - startAt;
        //存在则记录其开始和结束的位置,即重复子串
        if (currentMax > max) { endAt = j; startAt = i; }
    }
    //重复子串的长度
    return s.substring(startAt, endAt);
}
复制代码


2)题友的实现方式


使用HashSet的特点(不能存储重复元素),定义两个左右指针,然后在左指针向右移动的时候,我们从哈希集合中移除一个字符,在右指针向右移动的时候,我们往哈希集合中添加一个字符。

实现代码:微信截图_20220531202301.png


3.运行结果

微信截图_20220531202333.png

微信截图_20220531202353.png


三.题后思考


做这类的题目可能最先想到的都是暴力法,直接双层循环,依次比较,但是时间复杂度就高了,如官方题解里借助Hashset的特点去存储元素的话其实更加的简洁明了一些,还是得多看看题解,多学习学习这种思路。

目录
相关文章
|
2月前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
48 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
55 1
|
7月前
|
算法
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
63 0
|
4月前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
4月前
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
|
7月前
|
算法 测试技术 编译器
【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项
题目描述 题目 在字符矩阵中查找给定字符串的所有匹配项 给定一个M×N字符矩阵,以及一个字符串S,找到在矩阵中所有可能的连续字符组成的S的次数。所谓的连续字符,是指一个字符可以和位于其上下左右,左上左下,右上右下8个方向的字符组成字符串。用回溯法求解。
107 1
|
7月前
|
算法 C++
【优选算法】——滑动窗口——3. 无重复字符的最长子串
【优选算法】——滑动窗口——3. 无重复字符的最长子串
|
6月前
|
算法
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
68 0
|
7月前
|
人工智能 算法 测试技术
【字符串】【C++算法】828.统计子串中的唯一字符
【字符串】【C++算法】828.统计子串中的唯一字符
|
7月前
|
存储 算法 JavaScript
Leetcode算法系列| 3. 无重复字符的最长子串
Leetcode算法系列| 3. 无重复字符的最长子串