题目

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

示例

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

思路

滑动窗口

我们使用 HashSet 将字符存储在当前窗口 [i, j)[i,j)(最初 j = ij=i)中。 然后我们向右侧滑动索引 jj,如果它不在 HashSet 中,我们会继续滑动 jj。直到 s[j] 已经存在于 HashSet 中。此时,我们找到的没有重复字符的最长子字符串将会以索引 ii 开头。如果我们对所有的 ii 这样做,就可以得到答案

优化的滑动窗口

如果 s[j]s[j] 在 [i, j)[i,j) 范围内有与 j`重复的字符,我们不需要逐渐增加 i 。 我们可以直接跳过 [i,j']范围内的所有元素,并将 i变为 j' + 1

代码

滑动窗口

class Solution {

publicint lengthOfLongestSubstring(String s) {

int i = 0,j = 0,ans = 0;

int len = s.length();

        Set<Character> set = new HashSet<>();//char 和 Character的区别在哪

while(i < len && j < len){

if(!set.contains(s.charAt(j))){

                set.add(s.charAt(j++));

                ans = Math.max(ans, j-i);//c++ 中的max

            }

else{

                set.remove(s.charAt(i++));

            }

        }

return ans;

    }

}

优化的滑动窗口

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int i = 0,j = 0,ans = 0;
        int len = s.length();
        Map<Character, Integer> map = new HashMap<>();
       for( i = 0,j = 0;j < len;j++){
           if(map.containsKey(s.charAt(j))){
               i = Math.max(map.get(s.charAt(j)), i);
           }
           ans = Math.max(ans, j - i + 1);
           map.put(s.charAt(j), j+1);
       }
       return ans;
    }
}

canyue
1 声望1 粉丝