https://leetcode.com/problems/longest-substring-without-repeating-characters/#/description
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.
给定一串字符串,找出最长的没有重复字符的子串的长度。
例:
“abcabcbb
”, 答案为3(“abc”)
“pwwkew
”,答案为3(wke)
简单的答案:
public class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null ||"".equals(s)) return 0;
int longest = 1;
int strLen = s.length();
for(int start=0;start<strLen-1;start++){//子串开头的位置
int longestThisRound = 1;//记录一轮下来最长的长度
for(int end=start+1;end<strLen;end++){//逐位后移,并判断新增的字符是否已经存在
String subStr = s.substring(start, end);
int repeatIndex = subStr.indexOf(s.charAt(end));
if(repeatIndex >= 0 && repeatIndex < end){
break ;//子串中新增的一位已经存在于前方,则跳出循环
}
longestThisRound++;
}
if(longestThisRound > longest) longest = longestThisRound;
longestThisRound = 1;
}
return longest;
}
}
评选的答案,使用HashMap配合,只需要遍历字符串一次,即算出最长的子串长度。
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
Map<Character, Integer> map = new HashMap<>(); // current index of character
// try to extend the range [i, j]
for (int j = 0, i = 0; j < n; j++) {
if (map.containsKey(s.charAt(j))) {
i = Math.max(map.get(s.charAt(j)), i);
}
ans = Math.max(ans, j - i + 1);
map.put(s.charAt(j), j + 1);
}
return ans;
}
}