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
*/