最长不含重复字符的子字符串
此博客链接: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; } }
结果
出来混总是要还的