leetcode 3:繰り返し文字のない最長の部分文字列

leetcode 3:繰り返し文字のない最長の部分文字列

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/

おすすめ

転載: blog.csdn.net/lqy971966/article/details/107317044