Fork me on GitHub

leetcode——[003]Longest Substring Without Repeating Characters无重复字符的最长子串

题目

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

示例 1:

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

示例 2:

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

示例 3:

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

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

Example 1:

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

Example 2:

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

Example 3:

1
2
3
4
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.

解题方法

滑动窗口

以head、tail为窗口的起终点,初始窗口大小为1,初始位置为字符串第一个字符,tail保持向后滑动,每次检查窗口后面的一个字符在窗口中是否存在相同的字符,如果存在则滑动窗口起点到相同字符之后,每次滑动更新不含相同字符字串的最大长度。这段代码跑了6ms,超过了98.03%的Java提交。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Solution {
// Method 1 6ms 98.03%
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
if (s.length() == 1) {
return 1;
}
int res = 1;
int head = 0;
int tail = 0;
for (int i = 1; i < s.length(); i++) {
boolean inSub = false;
for (int j = head; j <= tail; j++) {
if (s.charAt(i) == s.charAt(j)) {
head = j + 1;
tail = i;
inSub = true;
break;
}
}
if (!inSub) {
tail++;
}
res = res < tail - head + 1 ? tail - head + 1 : res;
}
return res;
}
}
BJTU-HXS wechat
海内存知己,天涯若比邻。