题目】
Given a string, find the length of the longest substring without repeating characters.
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given “abcabcbb”, the answer is “abc”, which the length is 3.
Given “bbbbb”, the answer is “b”, with the length of 1.
Given “pwwkew”, 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.
【题意】
找到字符串中最长无重复子串的长度。
【代码】
/**
* 利用一个exist数组保存字符是否出现,从前向后遍历数组,如果遇到已存在的字符,
* 应该回退到这个字符上次出现的下一个位置从新开始统计,同时注意exist数组的同步更新。
* @param s
* @return
*/
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0)
return 0;
int res = 1;
boolean[] exist = new boolean[128];
int start = 0;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (exist[ch]) {
res = Math.max(res, i - start);
for (int k = start; k < i; k++) {
if (s.charAt(k) == ch) {
start = k + 1;
break;
}
exist[s.charAt(k)] = false;
}
} else
exist[ch] = true;
}
res = Math.max(res, s.length() - start);
return res;
}
- 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 int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
int[] index = new int[128]; // current index of character
// try to extend the range [i, j]
for (int j = 0, i = 0; j < n; j++) {
i = Math.max(index[s.charAt(j)], i);
ans = Math.max(ans, j - i + 1);
index[s.charAt(j)] = j + 1;
}
return ans;
}