3. Longest Substring Without Repeating Characters

求出一个string中最长的没有重复字符的子串。

还是比较简单的,直觉上感觉遍历一次就可以,依次判断string中的每个字符之前是否出现过(所以需要一个Set);还需要记录当前已经出现过的所有非重复字符,当出现重复字符时,把重复字符之前所有的字符都丢掉(所以需要一个Queue)。

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 注意边界条件的判断,leetcode的test case中很多用于坑爹的corner case。。。
        if (s == null || s.trim().length() == 0) {
            return 0;
        }

        Set<Character> set = new HashSet<Character>();  // 用于判断一个字符是否出现过
        Queue<Character> queue = new LinkedList<Character>();  // 保存包括当前字符并且无重复字符的最大子串

        int max = 0;
        for (int i = 0; i < s.length(); i++) {   // 遍历string
            char thisChar = s.charAt(i);  // 当前字符
            if (set.contains(thisChar)) {
                // 如果当前字符是已经出现过的,就把这个字符上次出现之前的所有字符都丢掉,这样queue中剩下的就是包括当前字符的、无重复字符的最大子串
                max = Math.max(max, queue.size());
                while (queue.size() > 0) {
                    char tmp = queue.poll();
                    if (tmp == thisChar)
                        break;
                    else
                        set.remove(tmp);   // 别忘了移除set中的元素,set中的元素和queue是一致的
                }
                queue.add(thisChar);
            } else {
                set.add(thisChar);
                queue.add(thisChar);
            }
        }

        return Math.max(max, queue.size());
    }
}

results matching ""

    No results matching ""