1、字符串包含问题
1)串的模式匹配算法
BF
class Solution { public: /* * @param source: source string to be scanned. * @param target: target string containing the sequence of characters to match * @return: a index to the first occurrence of target in source, or -1 if target is not part of source. */ int strStr(const char *source, const char *target) { // write your code here if (source == NULL || target == NULL) return -1; int slen = strlen(source); int tlen = strlen(target); if (tlen == 0) return 0; if (slen == 0) return -1; for (int i = 0; i < slen; ++i) { for (int j = 0, s = i; j < tlen && s < slen; ++j, ++s) { if (source[s] != target[j]) { break; } else { if (j == tlen - 1) return i; } } } return -1; } };
KMP
class Solution { public: /* * @param source: source string to be scanned. * @param target: target string containing the sequence of characters to match * @return: a index to the first occurrence of target in source, or -1 if target is not part of source. */ int strStr(const char *source, const char *target) { // write your code here if (source == NULL || target == NULL) return -1; int slen = strlen(source); int tlen = strlen(target); if (tlen == 0) return 0; if (slen == 0) return -1; return kmp(source, target); } int kmp(const char *source, const char *target) { int *next = getNext(target); int slen = strlen(source); int tlen = strlen(target); int i = 0, j = 0, res = -1; while (i < slen) { if (j == -1 || source[i] == target[j]) { ++i; ++j; } else { j = next[j]; } if (j == tlen) { res = i - tlen; break; } } delete[] next; return res; } int* getNext(const char *target) { int tlen = strlen(target); int *next = new int[tlen]; int i = 0, j = -1; next[0] = -1; while (i < tlen - 1) { if (j == -1 || target[i] == target[j]) { ++i; ++j; next[i] = j; } else { j = next[j]; } } return next; } };