題目:
方法一:
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;
}