给你一个目标串,请查找在给目标串中是否存在模式串,存在就输出第一个模式串在目标串中出现的位置。
输入
占两行,第一行是目标串(长度小于1000),第二行为模式串(长度小于100)。
输出
输出模式串在目标串中出现的位置,即模式串匹配到目标串时第一个字符在目标串的位置(注意从1开始描述字符开始位置),不能匹配时输出0.
样例输入 复制
appleorange
orange
样例输出 复制
6
#include <iostream>
#include <string>
using namespace std;
int main()
{
string a,b;
getline(cin,a);
getline(cin,b);
int i=0,j=0,m=0;
while(i<=a.length()-1)
{
if(a[i]==a[j])
{
if(j==b.length()-1)
{
cout<<i+1<<endl;
break;
}
i++;
j++;
}
else
{
j=0;
i++;
}
}
if(i>a.length()-1)
{
cout<<'0'<<endl;}
return 0;
}
目测,你的代码在没有匹配的时候不输出0
#include <iostream>
#include <string>
using namespace std;
int main()
{
string a, b;
getline(cin, a);
getline(cin, b);
int i = 0, j = 0, m = 0;
bool found = false;
while (i <= a.length() - 1)
{
if (a[i] == b[j])
{
if (j == b.length() - 1)
{
cout << i + 1 - b.length() + 1 << endl;
found = true;
break;
}
i++;
j++;
}
else
{
j = 0;
i++;
}
}
if (!found)
{
cout << '0' << endl;
}
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:def find_pattern(target, pattern):
n = len(target)
m = len(pattern)
for i in range(n - m + 1):
j = 0
while j < m:
if target[i + j] != pattern[j]:
break
j += 1
if j == m:
return i + 1
return 0
target = input("请输入目标字符串:")
pattern = input("请输入模式字符串:")
position = find_pattern(target, pattern)
print(position)
以上代码是一个简单的模式匹配算法,通过逐一比较字符来确定模式串是否出现在目标串中,并返回模式串在目标串中的位置。但该方法的时间复杂度较高,为O((n-m+1)m),在某些情况下可能会较慢。
为了优化代码,我们可以采用KMP算法来进行模式匹配。
KMP算法包括两个主要步骤: 1. 构建模式字符串的Next数组,用于记录模式字符串中每个位置的最长相同前后缀的长度。 2. 使用构建好的Next数组进行匹配,跳过不必要的比较。
下面是对代码的优化:
def build_next(pattern):
m = len(pattern)
next = [0] * m
j = 0
for i in range(1, m):
while j > 0 and pattern[i] != pattern[j]:
j = next[j - 1]
if pattern[i] == pattern[j]:
j += 1
next[i] = j
return next
def find_pattern(target, pattern):
n = len(target)
m = len(pattern)
next = build_next(pattern)
i, j = 0, 0
while i < n and j < m:
if target[i] == pattern[j]:
i += 1
j += 1
elif j > 0:
j = next[j - 1]
else:
i += 1
if j == m:
return i - m + 1
else:
return 0
target = input("请输入目标字符串:")
pattern = input("请输入模式字符串:")
position = find_pattern(target, pattern)
print(position)
这样修改后的代码使用了KMP算法进行模式匹配,只需要遍历目标字符串一次即可找到匹配位置,时间复杂度为O(n+m)。有助于提高算法的效率。