给你一个目标串,请查找在给目标串中是否存在模式串,存在就输出第一个模式串在目标串中出现的位置。 输入 占两行,第一行是目标串(长度小于1000),第二行为模式串(长度小于100)。 输出 输出模式串在目标串中出现的位置,即模式串匹配到目标串时第一个字符在目标串的位置(注意从1开始描述字符开始位置),不能匹配时输出0.
时间: 2024-03-09 16:47:40 浏览: 22
好的,这个问题可以使用栈来解决。我们可以使用单调栈来实现字符串匹配。
具体的思路如下:
1. 使用一个栈来记录模式串中每个字符的下标。
2. 从左到右遍历目标串,对于每个字符,判断是否与模式串栈顶的字符相同。
3. 如果相同,则将模式串栈顶的字符弹出,继续比较下一个字符;如果不同,则将模式串栈清空。
4. 如果模式串栈为空,说明已经匹配成功,输出当前位置减去模式串长度的值(因为匹配成功时,栈内字符的数量正好等于模式串的长度)。
5. 如果遍历完目标串后,仍然没有匹配成功,则输出0。
下面是使用C++代码实现:
```c++
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main(){
string t,p;
getline(cin,t);
getline(cin,p);
stack<int> s;
for(int i=0;i<p.size();i++){
s.push(i);
}
for(int i=0;i<t.size();i++){
int j=0;
stack<int> temp;
while(!s.empty() && j<p.size()){
if(t[i+j]==p[s.top()]){
temp.push(s.top());
s.pop();
j++;
}
else{
s.pop();
j=0;
}
}
while(!temp.empty()){
s.push(temp.top());
temp.pop();
}
if(j==p.size()){
cout<<i+1-j<<endl;
return 0;
}
}
cout<<0<<endl;
return 0;
}
```
这个算法的时间复杂度为$O(n)$,其中$n$为目标串的长度。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)