leetcode:3. 无重复字符的最长子串:java

前言

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

思路

用窗口的方法,因为题目要求这个字串是不含有重复的字符,所以可以通过窗口滑动的方式前进,如果有重复通过改变窗口的左侧的边界来把重复的字符进行过滤left = Math.max(left,map.get(s.charAt(i)) + 1 );。如果是abca这样的形式 此时就会将窗口的左边界右移一位,如果是abb这种的就直接筛选掉b字符及其之前的字符。通过 maxLen = Math.max(maxLen,i - left + 1);可以将在窗口中的最长的字符串长度传递下去

public class Demo01 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String temp = input.next();
        System.out.println(lengthOfLongestSubstring(temp));
    }
    public static int lengthOfLongestSubstring(String s) {
        HashMap<Character,Integer> map = new HashMap<>();
        int left = 0;//窗口的左边界
        int maxLen = 0;//最长的长度
        for (int i = 0; i < s.length(); i++) {
            if(map.containsKey(s.charAt(i))){
                left = Math.max(left,map.get(s.charAt(i)) + 1 );
            }
            map.put(s.charAt(i),i);
            maxLen = Math.max(maxLen,i - left + 1);
        }
        return maxLen;


    }

}

map.containsKey()判断该键在HasMap中是否存在

你可能感兴趣的:(leetCode,java,leetcode,算法)