您的位置:首页 > 其它

[LeetCode]Longest Substring Without Repeating Characters

2014-07-18 15:19 477 查看

题目描述

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without
repeating letters for "abcabcbb" is "abc", whichthe
length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

给出字符串中最长无重复字符的子串的长度。

解题思路



为了求得最长无重复字符的子串的长度,我们可以用一个int型数组来存放字符出现的位置,如果值为-1,说明字符还未出现过;用start 来记录最长无重复子串起始位置

用maxLen 来记录最长无重复子串最大长度;用变量i来遍历字符串;在一次循环中实现如下功能:

如果当前字符未出现,则数组中记录当前字符出现的位置,i++;
如果当前字符已出现,比较i - start和maxLen,如果大于则更新maxLen,同时将start和i更新到当前字符上一次出现的位置的后一位,位置数组归零;

需要注意的是按上述方法可能会忽略最后一个无重复子串(字符串尾部),所以需在循环结束后判断一下;

代码

/**
* Given a string, find the length of the longest substring without repeating characters. For example,
* the longest substring without repeating letters for "abcabcbb" is "abc",
*  whichthe length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
* @param s
* @return
*/
public static int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0)
return 0;
if (s.length() == 1)
return 1;

int n = s.length();//数组长度
int[] charPos = new int[128];//记录ASCII码出现的位置
int start = 0;//最长无重复子串起始位置
int maxLen = 0;//最长无重复子串最大长度
int i = 0;

Arrays.fill(charPos, -1);//初始值置为-1
while(i < n){
int ch = s.charAt(i) - 0;
if(charPos[ch]!=-1){
//如果[start,i)的子串长度大于maxLen,则更新maxLen
if(i - start > maxLen)
maxLen = i - start;
//start更新为重复字符的后一个位置
start = charPos[ch] + 1;
//i更新为重复字符的后一个位置,以便能够重新更新charPos
i = charPos[ch] + 1;
//置为初始值
Arrays.fill(charPos, -1);
} else {
//记录出现字符的位置
charPos[ch] = i;
i++;
}
}

//判断以字符串末尾结尾的无重复字符子串的长度是否大于maxLen
if(i - start > maxLen)
maxLen = i - start;
return maxLen;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: