赞
踩
时隔4年,继续记录一下自己的成长历程吧。
题目:medium
Given a string s, find the length of the longest substring without repeating characters.
Example 1:
Input: s = “abcabcbb”
Output: 3
Explanation: The answer is “abc”, with the length of 3.
Example 2:
Input: s = “bbbbb”
Output: 1
Explanation: The answer is “b”, with the length of 1.
Example 3:
Input: s = “pwwkew”
Output: 3
Explanation: The answer is “wke”, with the length of 3.
Notice that the answer must be a substring, “pwke” is a subsequence and not a substring.
Example 4:
Input: s = “”
Output: 0
Constraints:
0 <= s.length <= 5 * 104
s consists of English letters, digits, symbols and spaces.
这道题的目标是找到给定字符串s的最长无重复字符子串的长度。这里只要求输出最长长度,不要求输出最长子串。
15年(一刷): O(N)
public int lengthOfLongestSubstring(String s) { int res = 0, left = 0; int prev[] = new int[300]; // init prev array for (int i = 0; i < 300; ++i) prev[i] = -1; for (int i = 0; i < s.length(); ++i) { if (prev[s.charAt(i)] >= left) left = prev[s.charAt(i)] + 1; prev[s.charAt(i)] = i; if (res < i - left + 1) res = i - left + 1; } return res; }
19年(二刷): O(N)
public int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) { return 0; } Set<Character> set = new HashSet<Character>(); char[] strArray = s.toCharArray(); int result = 1, begin = 0; for(int i = 0, len = strArray.length; i < len; i++) { if(!set.contains(strArray[i])) { set.add(strArray[i]); result = Math.max(result, i - begin + 1); } else { while(strArray[begin] != strArray[i]) { set.remove(strArray[begin]); begin += 1; } begin += 1; } } return result; }
20年(三刷): O(N)
public int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) { return 0; } int left = 0, right = 0, len = s.length(), result = 1; Set<Character> set = new HashSet<>(); while (left < len && right < len) { if (!set.contains(s.charAt(right))) { set.add(s.charAt(right)); right += 1; result = Math.max(result, right - left); } else { set.remove(s.charAt(left)); left += 1; } } return result; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。