您的位置:首页 > 其它

【LeetCode】3. Longest Substring Without Repeating Characters

2017-10-06 12:58 344 查看
Given a string, find the
4000
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.

题意:题意很简单,就是给定一个字符串,从中找到最长的不包含重复字符的子串,并返回其长度。
思路:利用kmp的思想加以优化,不断向右扫描并记录该字符所在的位置。遇到重复,则将扫描位置移动到该字符所记录位置的右侧,继续扫描。可以用数组或map实现。

代码如下:
public int lengthOfLongestSubstring(String s) {
int max = 0, now = 0,i , j;
int pos[] = new int[128];
Arrays.fill(pos, -1);

for (i = 0;i < s.length();i++){
now = 1;
pos[s.charAt(i)] = i;

for (j = i + 1;j < s.length();j++){
if (pos[s.charAt(j)] > -1){
break;
}

pos[s.charAt(j)] = j;
now++;
}

if (now > max){
max = now;
}

if (j < s.length()){
i = pos[s.charAt(j)];
}

Arrays.fill(pos, -1);
}

return max;
}

public int lengthOfLongestSubstring(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max=0;
for (int i=0, j=0; i<s.length(); ++i){
if (map.containsKey(s.charAt(i))){
j = Math.max(j,map.get(s.charAt(i))+1);
}
map.put(s.charAt(i),i);
max = Math.max(max,i-j+1);
}
return max;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: