leetcode003无重复字符的最长子串

题目描述:

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

示例 1:

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

示例 2:

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

示例 3:

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

 解题思路:

  1.依次遍历字符串中的每个字符并将其下表和值存储到一个map中

  2.判断当前字符是否在map中已经出现,如果出现,则更新开始位置,如果没有出现,则判断是否更新最大长度

 

时间复杂度O(n^2)  

空间复杂度O(1)

 

class Solution {
    public int lengthOfLongestSubstring(String s) {
        
        // 边界判定
        if (s == null) {
            return 0;
        }
        
        // 开始处理的位置
        int start = 0;
        // 结果
        int result = 0;
        
        Map<Character, Integer> map = new HashMap<>(s.length());
        
        for(int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            // 如果当前字符在从start开始的位置已经出现过了,则更新start为一个元素位置开始
            if(map.containsKey(ch) && map.get(ch) >= start) {
                start = map.get(ch) + 1;
            }
            // 如果没有则判断是否更新最大长度
            else {
                result = Math.max(result, i - start + 1);
            }
            
            map.put(ch, i);
        }
        return result;
    }
}
View Code

 

posted @ 2018-12-18 11:50  llyanhuo  阅读(129)  评论(0)    收藏  举报