#include<stdlib.h>
#include<stdio.h>
#define NO_OF_CHARS 256
int min(int a, int b);
int longestUniqueSubsttr(char *str)
{ int max_i=0;
int cur_len = 1; // To store the lenght of current substring
int max_len = 1; // To store the result
int prev_index; // To store the previous index
int i;
int *visited
= (int *)malloc(sizeof(int)*NO_OF_CHARS
); char *s;
/* Initialize the visited array as -1, -1 is used to indicate that
character has not been visited yet. */
for (i = 0; i < NO_OF_CHARS; i++)
visited[i] = -1;
/* Mark first character as visited by storing the index of first
character in visited array. */
visited[str[0]] = 0;
/* Start from the second character. First character is already processed
(cur_len and max_len are initialized as 1, and visited[str[0]] is set */
for (i = 1; i < n; i++)
{
prev_index = visited[str[i]];
/* If the currentt character is not present in the already processed
substring or it is not part of the current NRCS, then do cur_len++ */
if (prev_index == -1 || i - cur_len > prev_index)
cur_len++;
/* If the current character is present in currently considered NRCS,
then update NRCS to start from the next character of previous instance. */
else
{
/* Also, when we are changing the NRCS, we should also check whether
length of the previous NRCS was greater than max_len or not.*/
if (cur_len > max_len)
{max_len = cur_len;
if(prev_index!=-1)
max_i=prev_index;
}
cur_len = i - prev_index;
}
visited[str[i]] = i; // update the index of current character
}
// Compare the length of last NRCS with max_len and update max_len if needed
if (cur_len > max_len)
{ max_len = cur_len;
if(prev_index!=-1)
max_i=prev_index;
}
free(visited
); // free memory allocated for visited s=&str[max_i];
i=0;
while(i<max_len)
{
i++;
*s++;
}
return max_len;
}
/* A utility function to get the minimum of two integers */
int min(int a, int b)
{
return (a>b)?b:a;
}
/* Driver program to test above function */
int main()
{
char str[] = "GEEKSFORGEEKS";
printf("The input string is %s \n", str
); int len = longestUniqueSubsttr(str);
printf("The length of the longest non-repeating character substring is %d", len
);
return 0;
}
I2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPHN0ZGlvLmg+CiNkZWZpbmUgTk9fT0ZfQ0hBUlMgMjU2CgppbnQgbWluKGludCBhLCBpbnQgYik7CgppbnQgbG9uZ2VzdFVuaXF1ZVN1YnN0dHIoY2hhciAqc3RyKQp7ICAgaW50IG1heF9pPTA7CiAgICBpbnQgbiA9IHN0cmxlbihzdHIpOwogICAgaW50IGN1cl9sZW4gPSAxOyAgLy8gVG8gc3RvcmUgdGhlIGxlbmdodCBvZiBjdXJyZW50IHN1YnN0cmluZwogICAgaW50IG1heF9sZW4gPSAxOyAgLy8gVG8gc3RvcmUgdGhlIHJlc3VsdAogICAgaW50IHByZXZfaW5kZXg7ICAvLyBUbyBzdG9yZSB0aGUgcHJldmlvdXMgaW5kZXgKICAgIGludCBpOwogICAgaW50ICp2aXNpdGVkID0gKGludCAqKW1hbGxvYyhzaXplb2YoaW50KSpOT19PRl9DSEFSUyk7CiAgICBjaGFyICpzOwoKICAgIC8qIEluaXRpYWxpemUgdGhlIHZpc2l0ZWQgYXJyYXkgYXMgLTEsIC0xIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdAogICAgICAgY2hhcmFjdGVyIGhhcyBub3QgYmVlbiB2aXNpdGVkIHlldC4gKi8KICAgIGZvciAoaSA9IDA7IGkgPCBOT19PRl9DSEFSUzsgIGkrKykKICAgICAgICB2aXNpdGVkW2ldID0gLTE7CgogICAgLyogTWFyayBmaXJzdCBjaGFyYWN0ZXIgYXMgdmlzaXRlZCBieSBzdG9yaW5nIHRoZSBpbmRleCBvZiBmaXJzdAogICAgICAgY2hhcmFjdGVyIGluIHZpc2l0ZWQgYXJyYXkuICovCiAgICB2aXNpdGVkW3N0clswXV0gPSAwOwoKICAgIC8qIFN0YXJ0IGZyb20gdGhlIHNlY29uZCBjaGFyYWN0ZXIuIEZpcnN0IGNoYXJhY3RlciBpcyBhbHJlYWR5IHByb2Nlc3NlZAogICAgICAgKGN1cl9sZW4gYW5kIG1heF9sZW4gYXJlIGluaXRpYWxpemVkIGFzIDEsIGFuZCB2aXNpdGVkW3N0clswXV0gaXMgc2V0ICovCiAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKQogICAgewogICAgICAgIHByZXZfaW5kZXggPSAgdmlzaXRlZFtzdHJbaV1dOwoKICAgICAgICAvKiBJZiB0aGUgY3VycmVudHQgY2hhcmFjdGVyIGlzIG5vdCBwcmVzZW50IGluIHRoZSBhbHJlYWR5IHByb2Nlc3NlZAogICAgICAgICAgIHN1YnN0cmluZyBvciBpdCBpcyBub3QgcGFydCBvZiB0aGUgY3VycmVudCBOUkNTLCB0aGVuIGRvIGN1cl9sZW4rKyAqLwogICAgICAgIGlmIChwcmV2X2luZGV4ID09IC0xIHx8IGkgLSBjdXJfbGVuID4gcHJldl9pbmRleCkKICAgICAgICAgICAgY3VyX2xlbisrOwoKICAgICAgICAvKiBJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgcHJlc2VudCBpbiBjdXJyZW50bHkgY29uc2lkZXJlZCBOUkNTLAogICAgICAgICAgIHRoZW4gdXBkYXRlIE5SQ1MgdG8gc3RhcnQgZnJvbSB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgcHJldmlvdXMgaW5zdGFuY2UuICovCiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLyogQWxzbywgd2hlbiB3ZSBhcmUgY2hhbmdpbmcgdGhlIE5SQ1MsIHdlIHNob3VsZCBhbHNvIGNoZWNrIHdoZXRoZXIKICAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIHByZXZpb3VzIE5SQ1Mgd2FzIGdyZWF0ZXIgdGhhbiBtYXhfbGVuIG9yIG5vdC4qLwogICAgICAgICAgICBpZiAoY3VyX2xlbiA+IG1heF9sZW4pCiAgICAgICAgICAgICAgICB7bWF4X2xlbiA9IGN1cl9sZW47CiAgICAgICAgICAgICAgICBpZihwcmV2X2luZGV4IT0tMSkKICAgICAgICAgICAgICAgIG1heF9pPXByZXZfaW5kZXg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBjdXJfbGVuID0gaSAtIHByZXZfaW5kZXg7CiAgICAgICAgfQoKICAgICAgICB2aXNpdGVkW3N0cltpXV0gPSBpOyAvLyB1cGRhdGUgdGhlIGluZGV4IG9mIGN1cnJlbnQgY2hhcmFjdGVyCiAgICB9CgogICAgLy8gQ29tcGFyZSB0aGUgbGVuZ3RoIG9mIGxhc3QgTlJDUyB3aXRoIG1heF9sZW4gYW5kIHVwZGF0ZSBtYXhfbGVuIGlmIG5lZWRlZAogICAgaWYgKGN1cl9sZW4gPiBtYXhfbGVuKQogICAgICAgeyBtYXhfbGVuID0gY3VyX2xlbjsKICAgICAgICAgICBpZihwcmV2X2luZGV4IT0tMSkKICAgICAgICAgICAgICAgIG1heF9pPXByZXZfaW5kZXg7CiAgICAgICB9CgoKICAgIGZyZWUodmlzaXRlZCk7IC8vIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdmlzaXRlZApzPSZzdHJbbWF4X2ldOwppPTA7CndoaWxlKGk8bWF4X2xlbikKewogICAgcHJpbnRmKCIlYyIsKnMpOwogICAgaSsrOwogICAgKnMrKzsKfQpwcmludGYoIlxuIik7CiAgICByZXR1cm4gbWF4X2xlbjsKfQoKLyogQSB1dGlsaXR5IGZ1bmN0aW9uIHRvIGdldCB0aGUgbWluaW11bSBvZiB0d28gaW50ZWdlcnMgKi8KaW50IG1pbihpbnQgYSwgaW50IGIpCnsKICAgIHJldHVybiAoYT5iKT9iOmE7Cn0KCi8qIERyaXZlciBwcm9ncmFtIHRvIHRlc3QgYWJvdmUgZnVuY3Rpb24gKi8KaW50IG1haW4oKQp7CiAgICBjaGFyIHN0cltdID0gIkdFRUtTRk9SR0VFS1MiOwogICAgcHJpbnRmKCJUaGUgaW5wdXQgc3RyaW5nIGlzICVzIFxuIiwgc3RyKTsKICAgIGludCBsZW4gPSAgbG9uZ2VzdFVuaXF1ZVN1YnN0dHIoc3RyKTsKICAgIHByaW50ZigiVGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBub24tcmVwZWF0aW5nIGNoYXJhY3RlciBzdWJzdHJpbmcgaXMgJWQiLCBsZW4pOwoKICAgIGdldGNoYXIoKTsKICAgIHJldHVybiAwOwp9Cg==