LeetCode - 3. Longest Substring Without Repeating Characters

来源:互联网 发布:什么是淘宝登录密码 编辑:程序博客网 时间:2024/06/06 13:56

这道题目的思想是使用一个HashSet来存储Longest Substring Without Repeating Characters,同时使用两个指针i,j分别指向HashSet的第一个元素将要添加的元素,如果j指向的当前将要添加的元素不存在于HashSet中,那么我们就将这个元素加入HashSet,同时更新max的值;如果j指向的当前元素已经在HashSet中,那么我们就删除i所指向的元素并且i++,直到可以将当前的元素添加到HashSet中,注意这里不是只删除重复的元素,而是从最先加入HashSet的元素开始删除知道把重复的元素删除,考虑下面的例子:

a b c b d e e

当j指向第二个b的时候,此时Set: a b c,应该删除a,b之后再将b加入进来,而不是只删除b之后再把b加入进来,否则就会造成HashSet中存储的元素不连续。时间复杂度为O(n),空间复杂度为O(k),其中k是longest substring without repeating characters的长度,代码如下:

public class Solution {    public int lengthOfLongestSubstring(String s) {        if(s == null || s.length() == 0) return 0;                int i = 0, j = 0, max = 0;        Set<Character> set = new HashSet<>();                while(j < s.length()){            if(!set.contains(s.charAt(j))){                set.add(s.charAt(j++));                max = Math.max(max, set.size());            }else{                set.remove(s.charAt(i++));            }        }                return max;    }}


知识点:

1. 这道题也可以看做是一道sliding windows类型的题目,遇到这样的题目,首先想到的是要使用Set这个集合,并且维持两个指针分别指向Set集合在数组中对应的两侧,根据题目的需求添加或者删除元素

0 0
原创粉丝点击