模式串问题,这个代码该怎么修改?

给你一个目标串,请查找在给目标串中是否存在模式串,存在就输出第一个模式串在目标串中出现的位置。
输入
占两行,第一行是目标串(长度小于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

img

#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;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:
    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)。有助于提高算法的效率。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^