LeetCode刻意練習16--無重複字符的最長子串

題目:
在這裏插入圖片描述
方法一:

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; 


	    }

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章