-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlengthOfLongestSubstring.c
More file actions
71 lines (53 loc) · 1.63 KB
/
lengthOfLongestSubstring.c
File metadata and controls
71 lines (53 loc) · 1.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
leetcode题目,计算不包含重复字符的子字符串的最大长度,描述如下:
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb", the answer is "abc", which the length is 3.
Given "bbbbb", the answer is "b", with the length of 1.
Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int lengthOfLongestSubstring(unsigned char* s) {
int *chars = malloc(256 * sizeof(int));
int *location = malloc(256 * sizeof(int));
int start = 0;
int end = 0;
int length = 0;
int max_len = 0;
memset(chars, 0, 256);
chars[s[end]] = 1; //标记该字符曾经出现过
location[s[end]] = end; //保存该字符的位置
length = 1;
max_len = 1;
end ++;
while(1) {
if (!s[end])
break;
if (chars[s[end]]) {
start = location[s[end]] + 1;
length = end - start + 1;
chars[s[end]] = 1;
location[s[end]] = end;
} else {
chars[s[end]] = 1;
location[s[end]] = end;
length ++;
if (length > max_len)
max_len = length;
}
printf("start %d,%c end %d,%c length %d\n", start, s[start], end, s[end], length);
end ++;
}
free(chars);
free(location);
return max_len;
}
int main()
{
int result = 0;
unsigned char s[] = "abcabcbb";
result = lengthOfLongestSubstring(s);
printf("result %d\n", result);
}