#include <stdio.h>
void printSubstring(char *start, int len) {
while (len--) {
start++;
}
}
char* longestUniqueSubstring(char *s, int *outLen) {
int lastSeen[256];
for (int i = 0; i < 256; i++)
lastSeen[i] = -1;
char *start = s;
char *end = s;
char *bestStart = s;
int bestLen = 0;
int index = 0; // position in string
while (*end != '\0') {
unsigned char c = (unsigned char)*end;
// if character seen inside current window
if (lastSeen[c] >= start - s) {
// move start just after previous occurrence
start = s + lastSeen[c] + 1;
}
lastSeen[c] = index;
int len = (end - start) + 1;
if (len > bestLen) {
bestLen = len;
bestStart = start;
}
end++;
index++;
}
*outLen = bestLen;
return bestStart;
}
int main() {
char str[] = "abcab p q r pqbcbb";
int len = 0;
char *res = longestUniqueSubstring(str, &len);
printf("Longest substring = "); printSubstring(res, len);
return 0;
}
CiNpbmNsdWRlIDxzdGRpby5oPgoKdm9pZCBwcmludFN1YnN0cmluZyhjaGFyICpzdGFydCwgaW50IGxlbikgewogICAgd2hpbGUgKGxlbi0tKSB7CiAgICAgICAgcHV0Y2hhcigqc3RhcnQpOwogICAgICAgIHN0YXJ0Kys7CiAgICB9CiAgICBwdXRjaGFyKCdcbicpOwp9CgpjaGFyKiBsb25nZXN0VW5pcXVlU3Vic3RyaW5nKGNoYXIgKnMsIGludCAqb3V0TGVuKSB7CiAgICBpbnQgbGFzdFNlZW5bMjU2XTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQogICAgICAgIGxhc3RTZWVuW2ldID0gLTE7CgogICAgY2hhciAqc3RhcnQgPSBzOwogICAgY2hhciAqZW5kID0gczsKCiAgICBjaGFyICpiZXN0U3RhcnQgPSBzOwogICAgaW50IGJlc3RMZW4gPSAwOwoKICAgIGludCBpbmRleCA9IDA7ICAvLyBwb3NpdGlvbiBpbiBzdHJpbmcKCiAgICB3aGlsZSAoKmVuZCAhPSAnXDAnKSB7CiAgICAgICAgdW5zaWduZWQgY2hhciBjID0gKHVuc2lnbmVkIGNoYXIpKmVuZDsKCiAgICAgICAgLy8gaWYgY2hhcmFjdGVyIHNlZW4gaW5zaWRlIGN1cnJlbnQgd2luZG93CiAgICAgICAgaWYgKGxhc3RTZWVuW2NdID49IHN0YXJ0IC0gcykgewogICAgICAgICAgICAvLyBtb3ZlIHN0YXJ0IGp1c3QgYWZ0ZXIgcHJldmlvdXMgb2NjdXJyZW5jZQogICAgICAgICAgICBzdGFydCA9IHMgKyBsYXN0U2VlbltjXSArIDE7CiAgICAgICAgfQoKICAgICAgICBsYXN0U2VlbltjXSA9IGluZGV4OwoKICAgICAgICBpbnQgbGVuID0gKGVuZCAtIHN0YXJ0KSArIDE7CiAgICAgICAgaWYgKGxlbiA+IGJlc3RMZW4pIHsKICAgICAgICAgICAgYmVzdExlbiA9IGxlbjsKICAgICAgICAgICAgYmVzdFN0YXJ0ID0gc3RhcnQ7CiAgICAgICAgfQoKICAgICAgICBlbmQrKzsKICAgICAgICBpbmRleCsrOwogICAgfQoKICAgICpvdXRMZW4gPSBiZXN0TGVuOwogICAgcmV0dXJuIGJlc3RTdGFydDsKfQoKaW50IG1haW4oKSB7CiAgICBjaGFyIHN0cltdID0gImFiY2FiIHAgcSByIHBxYmNiYiI7CgogICAgaW50IGxlbiA9IDA7CiAgICBjaGFyICpyZXMgPSBsb25nZXN0VW5pcXVlU3Vic3RyaW5nKHN0ciwgJmxlbik7CgogICAgcHJpbnRmKCJMb25nZXN0IHN1YnN0cmluZyA9ICIpOwogICAgcHJpbnRTdWJzdHJpbmcocmVzLCBsZW4pOwoKICAgIHJldHVybiAwOwp9