// // Created by Administrator on 2023/7/18. // #include // next 数组指针 patt 模式串 void buildNext(int* next, const std::string& patt) { int prefix; // 前缀 int suffix; // 后缀 for (prefix = 0, suffix = 0; suffix < patt.size(); ++suffix) { // 前后缀不相同 不同 后缀一直后退 while (patt[prefix] != patt[suffix] && prefix != suffix && prefix > 0) { prefix = next[prefix - 1]; } // 前后缀相同 那全部向后移动 suffix 在for头里 if (patt[prefix] == patt[suffix] && prefix != suffix) { ++prefix; } next[suffix] = prefix; } } /** * 查找 字符串 在文本中的 起始位置 * @param str 待查文本 * @param patt 模式串 查找的串 * @return 子串在主串中的起始位置 */ size_t stringIndexOf(const std::string& str, const std::string& patt) { if (str.empty() || patt.empty()) return -1; int next[patt.size()]; buildNext(next, patt); for (int str_i = 0, patt_i = 0; str_i < str.size(); ++str_i, ++patt_i) { while (str[str_i] != patt[patt_i] && patt_i > 0) { patt_i = next[patt_i - 1]; } // patt_i +1 在for头内 不在 while 与 if 之间 这里的patt_i还没等待到自增 所以还是下标最大值 if (patt_i == patt.size() - 1) { // str_1 是下标 patt.size() 是大小 差值1 故加1 return str_i - patt.size() + 1; } } return -1; } int main() { size_t index = stringIndexOf("aabaabaafa", "aabaaf"); printf("%zu\n", index); std::string temp = "在这种困难的抉择下, 本人思来想去, 寝食难安.每个人都不得不面对这些问题. " "在面对这种问题时, 要想清楚, " "随机一段废话, 到底是一种怎么样的存在. " "随机一段废话似乎是一种巧合,但如果我们从一个更大的角度看待问题," "这似乎是一种不可避免的事实. 要想清楚, 随机一段废话, 到底是一种怎么样的存在." "随机一段废话, 到底应该如何实现. 雷锋曾经提到过, " "自己活着,就是为了使别人过得更美好。这启发了我"; size_t index1 = stringIndexOf(temp, "随机一段废话"); printf("%zu\n", index1); char text[] = {temp[index1], temp[index1+1], temp[index1+2]}; printf("%s\n", text); size_t index2 = stringIndexOf("500201198807209975410101199712283432140201197412188071", "8807"); printf("%zu\n", index2); }