int strStr(char *haystack, char *needle) { if(needle[0] == '\0') return 0; int m = strlen(haystack); int n = strlen(needle); vector<int> nxt(n + 1); calNext(needle, n, nxt); int i = 0; int j = 0; while(i < m) { if(j == -1 || haystack[i] == needle[j]) { ++i; ++j; } else { j = nxt[j]; } if(j == n) return i - j; } return -1; }
string shortestPalindrome(string s) { if (s.size() <= 1) return s; string t = s; reverse(t.begin(), t.end()); s = s+"#"+t; vector<int> next; calNext(next, s); s = t; reverse(s.begin(), s.end()); return t.substr(0, t.size()-next.back()) + s; }