题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
代码(c)
int lengthOfLongestSubstring(char * s){
int start = 0;
int end = 0;
int length = 0;
int max = 0;
while(end < strlen(s)){
char tmp = s[end];
for(int index = start; index < end; index++){
if(s[index]==tmp){
start = index+1;
length = end - start;
break;
}
}
length++;
end++;
max = max < length ? length : max;
}
return max;
}
更优解法
int i; /* 计数器 */
int count = 0; /* 子串当前长度 */
int max = 0; /* 子串最大长度 */
int start = 0; /* 子串起始位置 */
int index[128] = {0}; /* 记录每个字符先后出现位置 */
for(i = 0; s[i] != '\0'; i++){
if(index[s[i]] > start){ /* 若为真,则说明字符s[i]在之前重复出现过 */
count = i - start; /* 记录此时子串的长度 */
if(count > max) /* 若当前子串大于先前记录的最大字串长度,则更新max */
max = count;
start = index[s[i]]; /* 更新新子串的起始位置 */
}
index[s[i]] = i + 1; /* 记录字符s[i]在整个字符串中出现的位置 */
}
count = i - start; /* 计算最后一个子串的长度 */
return count > max ? count : max;
(这个的逻辑还要重新写一下,明天再说。)