剑指 Offer 48. 最长不含重复字符的子字符串


请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }
        Map cntMap = new HashMap<>();
        int ans = 0;
        int left = 0, right = 0;
        while (right < s.length()) {
            cntMap.put(s.charAt(right), cntMap.getOrDefault(s.charAt(right), 0) + 1);
            if (cntMap.get(s.charAt(right)) == 2) {
                while (cntMap.get(s.charAt(left)) != 2) {
                    cntMap.put(s.charAt(left), cntMap.get(s.charAt(left)) - 1);
                    left++;
                }
                cntMap.put(s.charAt(left), cntMap.get(s.charAt(left)) - 1);
                left++;
            }
            ans = Math.max(ans, right - left + 1);
            right++;
        }
        return ans;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            System.out.println(new Solution().lengthOfLongestSubstring(in.next()));
        }
    }
}

相关