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

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一秒钟。留个言点个赞呗,谢谢你#

你可能感兴趣的:(数据结构与算法,JAVA,LeetCode)