您的位置:首页 > 其它

[Leetcode] 3. Longest Substring Without Repeating Characters

2017-05-19 09:34 513 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: