题目描述

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

示例 1:

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

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

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

来源:力扣(LeetCode)  链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters

解题思路

遍历字符串,如果set中没有,长度累加,并加入set中,如果当前字符串最大长度大于以往的长度,更新最大长度;如果set中存在,清空set,清空子串长度,从开始计算子串长度位置的下一位开始重新计算,直到把整个字符串全都遍历完成。

解题代码

下边的代码,执行用时:146 ms  内存消耗:38.8 MB。(应该还有更好方案,后期想到了再更新)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int result = 0;
        int resultR = 0;
        int sig = 0;//子串开始位置
        Set<String> sSet = new HashSet<String>();
        for(int i=0; i<s.length(); i++) {
            if(sSet.contains(s.charAt(i)+"")) {//判断子串是否重复
                sSet.clear();
                result = 0;
                sig++;
                i = sig;//设置子串开始位置,从开始位置往后进行遍历
            }
            result++;//子串长度
            if(resultR < result) {//保留子串长度最大值
                resultR = result;
            }
            sSet.add(s.charAt(i)+"");
        }
        return resultR;
    }
}

代码仓库

gitee:https://gitee.com/Tong_Cheng_Yu/leetcode/tree/master

github:https://github.com/t-c-y/leetcode