题解 | #无重复字符的最长子串#

无重复字符的最长子串

http://www.nowcoder.com/questionTerminal/2787a88e2a8a4769added6a9be8e4857

对于求解字符子串的问题,可以考虑采用滑动窗口的策略。首先,创建一个集合windows,表示窗口内的子串无重复字符,窗口大小表示无重复子串的长度;然后声明两个变量,分别表示窗口的左边界L和右边界R。如果当前字符不在窗口中,则集合中添加该元素,同时窗口向右扩展;如果窗口中存在当前字符,则删除当前字符,并将左边界向右移动,直到不存在该字符为止。

package com.jz.day1120;

import java.util.*;

/**
 * 找出字符串的最长无重复字符子串
 */
public class LongestUniqueStr {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String str = sc.nextLine();
            int res = solution(str);
            System.out.println(res);
        }
        sc.close();
    }

    private static int solution(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }
        if (str.length() == 1) return 1;
        Set<Character> windows = new HashSet<>();
        int L = 0, R = 0, maxValue = 0;
        while (R < str.length()) {
            char chr = str.charAt(R++);
            while (windows.contains(chr)) {
                //移动左边界,缩小窗口
                windows.remove(str.charAt(L++));
            }
            windows.add(chr);
            maxValue = Math.max(maxValue, windows.size());
        }
        return maxValue;
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务