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

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

示例 1:

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

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

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

提示:

s.length <= 40000

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

自我解(暴力,时间复杂度为O(nnn))

class Solution {
     
    public int lengthOfLongestSubstring(String s) {
     
        if(s.equals(""))
        return 0;
        int result = 1;
        for(int i = 0 ; i < s.length() ; i ++){
     
            int max = 0;
            for(int j = i+1 ; j < s.length() ; j ++){
     
                int flag = 0;
                for(int k = i ; k <j ; k++){
     
                    if(s.charAt(j)==s.charAt(k)){
     
                        flag=1;
                        i=k;
                        break;
                    }
                }
                if(flag==1)
                break;
                max = j-i+1;
                if(max>result)
                result=max;
            }
        }
        return result;
    }
}

剑指 Offer 48. 最长不含重复字符的子字符串_第1张图片
官方解(哈希表+动态规划,时间复杂度为O(n))

class Solution {
     
    public int lengthOfLongestSubstring(String s) {
     
        Map<Character, Integer> dic = new HashMap<>();
        int res = 0, tmp = 0;
        for(int j = 0; j < s.length(); j++) {
     
            int i = dic.getOrDefault(s.charAt(j), -1); // 获取索引 i
            dic.put(s.charAt(j), j); // 更新哈希表
            tmp = tmp < j - i ? tmp + 1 : j - i; // dp[j - 1] -> dp[j]
            res = Math.max(res, tmp); // max(dp[j - 1], dp[j])
        }
        return res;
    }
}

剑指 Offer 48. 最长不含重复字符的子字符串_第2张图片

官方解(哈希表+双指针,时间复杂度为O(n))

class Solution {
     
    public int lengthOfLongestSubstring(String s) {
     
        Map<Character, Integer> dic = new HashMap<>();
        int i = -1, res = 0;
        for(int j = 0; j < s.length(); j++) {
     
            if(dic.containsKey(s.charAt(j)))
                i = Math.max(i, dic.get(s.charAt(j))); // 更新左指针 i
            dic.put(s.charAt(j), j); // 哈希表记录
            res = Math.max(res, j - i); // 更新结果
        }
        return res;
    }
}


剑指 Offer 48. 最长不含重复字符的子字符串_第3张图片

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