每日算法:无重复字符的最长子串

题目描述

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

示例 1:

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

示例 2:

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

示例 3:

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

思路:

  1. 个人认为本题的难点在于如何将题目要求解析成可以用循环完成的
  2. 采用区间移动的方法来进行分析。
  3. 假设在字符串上有一区间,[i,j]。其中每循环一次,j++,I不变。并将每次循环到的元素存储到集合中。当区间的右端的字符已经在集合中存在的时候,此时。一个无重复的子字符串就已经找到了。
  4. 那么重点是,在找到一个无重复的子字符串后,应该如何寻找下一个无重复的子字符串。此时找到集合中那个重复元素对应的下标。使i=该下标+1。即从之前重复字符的下一位开始寻找。那么可以确定在区间内的元素总是无重复的。通过比较每个无重复的长度可以找出最长的子字符串的长度。

代码:

public class LengthOfLongestSubstring {
    public static void main(String[] args) {
        System.out.println(lengthOfLongestSubstring("aebacdcbb"));
    }

    /**
     * 假设s不为null和""
     * @param s
     * @return
     */
    public static int lengthOfLongestSubstring(String s) {
        List list = new ArrayList();
        Class<? extends String>[] c1 = new Class[1];
        c1[1] = String.class;
        //ans 表示无重复子字符串的长度
        int n = s.length(), ans = 0;
        // current index of character
        Map<Character, Integer> map = new HashMap<>();
        // try to extend the range [i, j]
        for (int j = 0, i = 0; j < n; j++) {
            if (map.containsKey(s.charAt(j))) {
                //将i移动到集合中与s.charAt(j)相同的字符的下一位
                i = Math.max(map.get(s.charAt(j)), i);
            }
            //和上一个无重复子字符串比较,取较大值。
            ans = Math.max(ans, j - i + 1);
            map.put(s.charAt(j), j + 1);
        }
        return ans;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值