Here is my own un-golfed answer in C. I'm sure someone can beat it: #include <stdio.h> #include <string.h> #include <assert.h> int tailrep(char *str, char *sub, int sublen, int len) { if (str == sub) { return 1; } int i; for (i = 0; i < sublen; i++) { char *a, *b; a = str + len - sublen; b = sub + sublen - 1; // printf("%p->%c %p->%c\n", a - i, a[-i], b - i, b[-i]); if (a[-i] != b[-i]) { return 0; } } return tailrep(str, sub - sublen - 1, sublen + 1, len - sublen); } int istailrep(char *str) { int len = strlen(str); if (len < 3) { return 0; } return tailrep(str, str + len - 1, 1, len - 1); } int main() { // must be false assert(!istailrep("")); assert(!istailrep("a")); assert(!istailrep("aa")); assert(!istailrep("aab")); assert(!istailrep("abcbbc")); assert(!istailrep("abcdabcdabcd")); // must be true assert(istailrep("aaa")); assert(istailrep("abb")); assert(istailrep("abcbcc")); assert(istailrep("abcdbcdcdd")); assert(istailrep("abcdebcdecdedee")); printf("yay\n"); return 0; }