题目:
方法一:
1.定义一个整型数组visited[]
用于记录已经遍历过的字符串中所包含的字母。注意数组存放的不是char类型字符,而是将数组中字符的ASII值的索引用于存储该字符在当前遍历的字符串中最后出现的位置。
2.从左到右扫面字符串,并且 记录到目前为止最长的无重复字符串的长度。max_len
用于记录最长的无重复字符串的长度,cur_len
用于记录当前无重复字符串的长度。
3.对于每个新的元素,我们看它是否已经出现在我们已经遍历过的字符串中(看有没有在visited[] ):
-
如果没有,那么
cur_len
加1; -
如果有,那么还分两种情况:
-
新的元素 不是 当前NRCS(non-repeating-character-string) 的一部分,例如:*ABCDEEA中,当遍历到最后一个A时,当前的NRCS是 E ,新的 A 不在E中
这时我们将cur_len
加1. -
新的元素 是 当前NRCS(non-repeating-character-string) 的一部分,例如:ABCDEA中,当遍历到最后一个E时,当前的NRCS是 ABCDE ,新的 A在ABCDE当中
== 这是我们当前的NCRS 就要进行改变,变成从B开始的字符串。
下面是代码的实现:
public int lengthOfLongestSubstring(String s) {
int[] visited=new int[256];
for(int i=0;i<visited.length;i++)
{
visited[i]=-1;
}
visited[s.charAt(0)]=0;
int cur_len=1;
int max_len=1;
for (int i = 1; i < s.length(); i++) {
int pre_index=visited[s.charAt(i)];
if(pre_index==-1||i-pre_index>cur_len)
cur_len++;
else
{
max_len=Math.max(cur_len, max_len);
cur_len=i-pre_index;
}
visited[s.charAt(i)]=i;
}
if (cur_len > max_len)
max_len = cur_len;
return max_len;
}