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.
thinking:
使用动态规划的思想,动态计算最大长度
bacdfeaads
| |
==> 向最大字符串内添加一个字符
bacdfeaads
| |
==> 下一个字符是重复字符
bacdfeaads
| |
==> 将head后移
bacdfeaads
| |
==> 添加
...
Solution1:
public int lengthOfLongestSubstring(String s) {
int head = 0;
int tail = 0;
int longest = 0;
int length = s.length();
String now;
String letter;
for (; tail < length; tail++) {
now = s.substring(head, tail);
letter = s.substring(tail, tail + 1);
if (now.indexOf(letter) < 0) {
if (longest < now.length() + 1) {
longest = now.length() + 1;
}
} else {
head = s.indexOf(letter, head) + 1;
}
}
return longest;
}
Soluction2:
答案
public int lengthOfLongestSubstring1(String s) {
int[] letters = new int[128];
int longest = 0;
int index = 0;
for(int i = 0; i < s.length(); i++){
index = Math.max(letters[s.charAt(i)], index);
longest = Math.max(i - index + 1, longest);
//+1有深意
// 1. s可能是"" => longest不能为1
// 2. s的长度可能是1 => i - index + 1
//综上两个原因 => i + 1
letters[s.charAt(i)] = i + 1;
}
return longest;
}