最长不含重复字符的子字符串

此博客链接:https://www.cnblogs.com/ping2yingshi/p/14454584.html

最长不含重复字符的子字符串

题目链接:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/submissions/

题目

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

 

示例 1:

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

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

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

题解

寻找不重复的子串,可以利用动态滑动窗口,每次判断窗口内部是否有重复度的元素,利用双指针,先移动一个指针left,判断移动过的元素是否有相同的字符,如果有相同的字符,就再次移动另外一个指针right,一直移动right,知道窗口内部没有相同的元素位置,记录没有相同元素滑动窗口的长度。

方法:

         1.把数组中的元素放入map中判断是否有相同的元素。

         2.没有相同元素移动left指针,把元素添加到map中,有相同元素时,移动right指针,从map中移除相同元素。

        3.每次移动元素值,取滑动窗口的最大值。

代码

class Solution {
    public int lengthOfLongestSubstring(String s) {
         int left=0;
         int rigth=0;
         int res=0;
         Set<Character> set=new HashSet<>();
         for( left=0;left<s.length();left++)
         {
             char temp=s.charAt(left);
             while(set.contains(temp))
             {
                 set.remove(s.charAt(rigth++));
             }
             set.add(temp);
             res=Math.max(res,left-rigth+1);
         }
         return res;
    }
}

 

结果

 

posted @ 2021-02-27 00:45  萍2樱释  阅读(182)  评论(2编辑  收藏  举报