天天刷题-->LeetCode(无重复字符的最长字串)


个人名片:
作者简介:一名大二在校生,热爱生活,爱好敲码!
\ 个人主页 :holy-wangle
➡系列内容: ️ tkinter前端窗口界面创建与优化
️ Java实现ATP小系统
✨个性签名: 不积跬步,无以至千里;不积小流,无以成江海


         今天的算法题是关于字符串!

        下面看看我们的题目是什么 。

      无重复字符的最长字串

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

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

示例 1:

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

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


         从题目来看,很明显,这道题就是给定一个字符串的内容,让我们把含不重复字母的最长的字符串子串的长度求出来。

        思路:

        使用滑动窗口的思想去解决。

        滑动窗口思想是非常重要的一种思想,可以用来解决数组,字符串的子元素问题。它可以将嵌套循环的问题,转换为单层循环问题,降低时间复杂度,提高效率。

        滑动窗口的思想非常简单,它将子数组(子字符串)理解成一个滑动的窗口,然后将这个窗口在数组上滑动,在窗口滑动的过程中,左边会出一个元素,右边会进一个元素,然后只需要计算当前窗口内的元素值即可。

        可用滑动窗口思想解决的问题,一般有如下特点:

  1. 窗口内元素是连续的。就是说,抽象出来的这个可滑动的窗口,在原数组或字符串上是连续的。
  2. 窗口只能由左向右滑动,不能逆过来滑动。就是说,窗口的左右边界,只能从左到右增加,不能减少,即使局部也不可以。

算法思路

  1. 使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。
  2. 先不断地增加 right 指针扩大窗口 [left, right],直到窗口符合要求。
  3. 停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求。同时,每次增加 left,我们都要更新一轮结果。
  4. 重复第 2 和第 3 步,直到 right 到达尽头。

第 2 步相当于在寻找一个「可行解」,然后第 3 步在优化这个「可行解」,最终找到最优解。 左右指针轮流前进,窗口大小增增减减,窗口不断向右滑动。

         下面是图解:        ans代表最长不重复字符的字串的长度

        天天刷题-->LeetCode(无重复字符的最长字串)_第1张图片  

        遇到重复出现的字母start就跳转到字母那里,end一直往下走。 

         java代码实现:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/*
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
 */
class FindLength{
    public int lengthOfLongestSubstring(String s)
    {
        int n = s.length(),ans = 0;
        Map map = new HashMap<>();
        for (int end = 0,start = 0; end < n ; end++) {
            char mark =  s.charAt(end);
            if (map.containsKey(mark))
            {
                start = Math.max(map.get(mark),start);
            }
            ans = Math.max(ans,end - start +1);
            map.put(mark,end+1);
        }
        return ans;

    }
}
public class Lcode_2 {
    public static void main(String[] args) {
        FindLength f = new FindLength();
        System.out.println(f.lengthOfLongestSubstring("ass"));

    }
}


感谢各位的观看,创作不易,能不能给哥们来一个点赞呢!!!

好了,今天的分享就这么多了,有什么不清楚或者我写错的地方,请多多指教!

私信,评论我呗!!!!!!

关注我下一篇不迷路哦!

你可能感兴趣的:(leetcode,算法,java)