LeetCode(3):无重复字符的最长子串 Longest Substring Without Repeating Characters(Java)

234 篇文章 1 订阅
177 篇文章 0 订阅

2019.4.18 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)

依旧,字符串问题优先考虑动态规划~
这道题可以采用滑动窗口策略。设立begin和end指针标志窗口的两端,建立一个HashSet来保存窗口内的元素。当end对应元素不存在HashSet中时,end前移;当end对应元素存在HashSet中时,将元素从set中删除并将begin前移,直到删去end为止。全程取最大的窗口长度即可。


传送门:无重复字符的最长子串

Given a string, find the length of the longest substring without repeating characters.

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

Example 1:
Input: "abcabcbb"
Output: 3 
Explanation: The answer is "abc", with the length of 3. 

Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.

Example 3:
Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3. 
             Note that the answer must be a substring, "pwke" is a subsequence and not a substring.


import java.util.HashSet;

/**
 *
 * Given a string, find the length of the longest substring without repeating characters.
 * 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
 *
 */

public class LongestSubstringWithoutRepeatingCharacters {

    public int lengthOfLongestSubstring(String s) {
        int begin = 0;
        int end = 0;
        int maxlen = 0;
        int length = s.length();
        HashSet<Character> hashset = new HashSet<>();
        while(end < length){
            char c = s.charAt(end);
            if(!hashset.contains(c)){
                hashset.add(c);
            }
            else {
                while(s.charAt(begin) != c){
                    hashset.remove(s.charAt(begin));
                    begin++;
                }
                begin++;
            }
            maxlen = end - begin + 1 > maxlen ? end - begin + 1 : maxlen;
            end++;
        }
        return maxlen;
    }

    //改进版本:当end对应元素不存在HashSet中时,end前移;当end对应元素存在HashSet中时,将元素从set中删除并将begin前移,直到删去end为止
    public int lengthOfLongestSubstring1(String s) {
        int n = s.length();
        HashSet<Character> set = new HashSet<>();
        int ans = 0, i = 0, j = 0;
        while (i < n && j < n) {
            // try to extend the range [i, j]
            if (!set.contains(s.charAt(j))){
                set.add(s.charAt(j++));
                ans = Math.max(ans, j - i);
            }
            else {
                set.remove(s.charAt(i++));
            }
        }
        return ans;
    }

}



#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值