leetcode 3 :无重复字符的最长子串

leetcode 3 :无重复字符的最长子串

  • 1. 题目
  • 2. 示例:
  • 3. 自己的解决方法
  • 4. 标准答案

1. 题目

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

2. 示例:

输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

3. 自己的解决方法

int lengthOfLongestSubstring(char * s){
	
}

4. 标准答案

int lengthOfLongestSubstring(char * s)
{
	int iLoop;              /*    计数器    */
	int subStrLen = 0;      /* 子串当前长度 */
	int subStrMax = 0;      /* 子串最大长度 */
	int subStrStart = 0;    /* 子串起始位置 */
	int index[128] = {0};   /* 记录每个字符先后出现位置 */
	
	for(iLoop = 0; s[iLoop] != '\0'; iLoop++){
		//printf("iLoop = %d\n", iLoop);
		
		/* 若为真,则说明字符 s[iLoop] 如 s[3]=a 在之前重复出现过 */
		if(index[s[iLoop]] > subStrStart){ 
		
			/* 记录此时子串的长度 如 开始 abca 长度=3-0=3*/
			subStrLen = iLoop - subStrStart; 
			
			 /* 更新max */
			if(subStrLen > subStrMax){
				subStrMax = subStrLen;
			}
			
			/* 更新新子串的起始位置 */
			subStrStart = index[s[iLoop]]; 
			//printf("subStrStart = %d\n",subStrStart);
		}
		
		/* 记录字符 s[iLoop] 在整个字符串中出现的位置 */
		index[s[iLoop]] = iLoop + 1; 
	}
	
	subStrLen = iLoop - subStrStart; /* 计算最后一个子串的长度 */
	return subStrLen > subStrMax ? subStrLen : subStrMax;
}

/*
					a b c a b c b b 
iLoop 				0 1 2 3 4 5 6 7
index[s[iLoop]] = 	1 2 3 4 5 6 7 8 	
subStrStart		 	0 0 0 1 2 3 5 7
*/

参考: https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/cyu-yan-shuang-yi-bai-by-wu-sheng-23/

你可能感兴趣的:(leetcode,无重复字符的最长子串,leetcode3,刷LeetCode,leetcode,算法)