获取不含相同字符最长子串

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110

#include <stdio.h>
#include <unistd.h>
#include <string.h>

char *
getMaxDistinctSubString1(char *text, int *maxLen)
{
int len = strlen(text);
char *str=NULL;
int begin=0, size, pos = 0, maxPos=0;

*maxLen=0;
while (begin < len)
{
str = text + begin;
for (size = 1; size <= len - begin; size++)
{
for (pos = 0; pos < size; pos++)
{
if (*(char *)(str+pos) == *(char *)(str+size))
{
if (size > *maxLen)
{
*maxLen = size;
maxPos = begin;
}
goto found;
}
}


if (size > *maxLen)
{
*maxLen = size;
maxPos = begin;
}
}
found:
begin++;
}

return text+maxPos;
}

char *
getMaxDistinctSubString2(char *text, int *maxLen)
{
int i, newLen, len=strlen(text);
char *res=NULL, *begAddr, *cmpAddr, mark[128];

*maxLen=0;
*begAddr=text;
memset(mark, 0, 128);
for (i = 0; i < len; i++)
{
mark[*(char *)(text+i)] = 1;
cmpAddr = text+i+1;
if (i+1 == len || mark[*cmpAddr])
{
newLen = cmpAddr - begAddr;
if (newLen > *maxLen)
{
*maxLen = newLen;
res = begAddr;
}
begAddr = cmpAddr;
memset(mark, 0, 128);
}
}

return res;
}

int
main(int argc,char* argv[])
{
char ch, *text = NULL, *subStr = NULL;
int i, len = 0;

while ((ch = getopt(argc, argv, "s:")) != -1)
{
switch (ch)
{
case 's':
if(optarg == NULL)
{
fprintf(stderr, "-s must give the test string!");
exit(1);
}
text = optarg;
break;
default:
fprintf(stderr, "Unknown option: %cn",(char)optopt);
exit(1);
}
}
if (text == NULL)
{
fprintf(stderr, "ERROR: must use -s give the test string!");
exit(1);
}

subStr = getMaxDistinctSubString2(text, &len);
printf("Result: %dn", len);
for (i=0; i<len; i++)
putchar(*(char*)(subStr+i));
printf("n");
return 0;
}