68 lines
2.6 KiB
C++
68 lines
2.6 KiB
C++
//
|
|
// Created by Administrator on 2023/7/18.
|
|
//
|
|
|
|
#include <string>
|
|
|
|
// 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);
|
|
} |