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; }
|
近期评论