好像不是这个问题 标准输入为3 qwertyuiop tyu aabbccdd ccc aaaabababac abac 答案标准输出为-1 0 0 5 -1 0 1 0 -1 0 0 1 8 而我的标准输出为-1 0 0 0 -1 0 1 0 -1 0 0 1 8
时间: 2024-10-23 14:16:11 浏览: 22
零基础3天学会盲打文章包
看起来你在编写一个程序,该程序需要根据给定的字符串列表,计算其中某字符串在其他字符串中首次出现的位置。你的代码返回了一些不符合预期的结果,我们来看看哪些地方出了问题。
首先,从提供的示例来看,你的程序可能有两个问题:
1. 对于输入 `ccc` 和 `aaaabababac`,标准输出应该是 `-1 0 1`,但你的结果是 `-1 0 0`。这表明在第一个字符串 `ccc` 中,你没有找到第二个字符串 `aaaabababac` 的匹配位置,实际上,`c` 应该是第0个位置。你需要检查 `Getpos` 函数在遇到这种情况下是否正确处理了匹配位置。
2. 对于 `aaaabababac` 和 `abac`,你应该输出 `-1 0 0 1`,因为 `abac` 在 `aaaabababac` 的第8个位置开始匹配。然而,你只输出了 `-1 0 0`,这意味着没有找到第4次匹配。可能是你在遍历过程中错过了某些情况。
要解决这些问题,你可以按照下面的步骤检查你的 `Getpos` 函数:
- 确保在 `Getpos` 函数内部,当 `j` 等于 `T.size()` 时,即找到了完全匹配,你应该正确地更新匹配起始位置 `i - j` 并返回,同时检查是否还有剩余的 `S` 字符需要比较,如果没有则加1。
- 在遍历字符串列表时,每次调用 `Getpos` 后,确认输出结果是否正确,如果有遗漏的匹配,可能是因为没有处理完所有输入字符串。
下面是可能修复 `Getpos` 函数的部分代码:
```cpp
// ... (之前的Getpos函数)
else {
j = next[j]; // 修改这里,从next数组获取新的索引
if (j == T.size()) {
cout << i - 1 << ' '; // 输出匹配起始位置,并加上1,因为要计数位置而非次数
// 这里检查是否还有剩余的S需要比较,如果不是,则继续下一个字符串
if (i == S.size()) break;
i++; // 继续下一位
}
}
```
现在,你应该能够得到正确的输出。如果你想要更详细的帮助,或者对代码中的某个部分有疑问,可以提出相关的
阅读全文