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; 


	    }

在这里插入图片描述

发布了49 篇原创文章 · 获赞 2 · 访问量 879

猜你喜欢

转载自blog.csdn.net/qq_43720551/article/details/104909319