B : DS串应用–串替换

简介: 这篇文章介绍了如何使用KMP算法在给定的主串中查找模式串的位置,并用替换串替换模式串的C++程序实现,仅考虑单次替换情况。

B : DS串应用–串替换

Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 23     Solved: 17

Description

给出主串、模式串、替换串,用KMP算法找出模式串在主串的位置,然后用替换串的字符替换掉模式串

本题只考虑一处替换的情况,如果你想做的完美一些,能够实现多处替换那可能需要考虑模式串和替换串长度不一致的情况

Input

第一个输入t,表示有t个实例

第二行输入第1个实例的主串,第三行输入第1个实例的模式串,第四行输入第1个实例的替换串

以此类推

Output

第一行输出第1个实例的主串

第二行输出第1个实例的主串替换后结果,如果没有发生替换就输出主串原来的内容。

以此类推

Sample Input

4
aabbccdd
bb
ff
aaabbbccc
ddd
eee
abcdef
abc
ccccc
abcdef
abc
c

Sample Output

aabbccdd
aaffccdd
aaabbbccc
aaabbbccc
abcdef
cccccdef
abcdef
cdef

解题思路:KMP的具有高效字符串匹配优势。
在这里编写出KMP模板后,用KMP查找字符串b在a中位置,查找到后用string 的内置函数erase(位置,删除个数)来删掉,
然后用insert(位置,字符串)插入进去。

ac代码如下:

#include<iostream>
using namespace std;
int nextt[1000000];
void Get_next(string a)
{
    int i=0,k=-1;
    int len=a.length();
    nextt[0]=-1;
    while(i<len)
    {
        if(k==-1||a[i]==a[k])
        {
            i++,k++;
            nextt[i]=k;
        }
        else k=nextt[k];
    }
}
int KMP(string a,string b)
{
    int i=0,j=0;
    int len=a.length(),len1=b.length();
    Get_next(b);
    while(i<len&&j<len1)
    {
        if(j==-1||a[i]==b[j])i++,j++;
        else j=nextt[j];
    }
    if(j==len1)return i-j;
    else return -1;
}
int main()
{
    string a,b,c;
    int n;
    cin>>n;
    while(n--)
    {
        cin>>a>>b>>c;
        cout<<a<<endl;
        int m=KMP(a,b);
        if(m!=-1)
        {
            a.erase(m,b.length());
            a.insert(m,c);
        }
        cout<<a<<endl;
    }
    return 0;
}
相关文章
|
C语言
带你快速了解字符(串)函数(一)
带你快速了解字符(串)函数(一)
|
存储 算法 C语言
串结构解析
串结构解析
|
2月前
|
算法 C++
D : DS串应用—最长重复子串
这篇文章提供了一种C++程序,用于通过KMP算法计算给定字符串的最长不重叠重复子串的长度,如果没有重复子串则输出-1。
|
2月前
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
2月前
|
C++
串应用- 计算一个串的最长的真前后缀
这篇文章提供了一个C++程序,用于找出给定字符串的最长真前后缀,并展示了如何通过计算每个子串的最长相同前后缀来实现这一功能。
带你快速了解字符(串)函数(二)
带你快速了解字符(串)函数(二)
带你快速了解字符(串)函数(三)
带你快速了解字符(串)函数(三)
|
5月前
【每日一题Day237】LC1375二进制字符串前缀一致的次数 | 技巧题
【每日一题Day237】LC1375二进制字符串前缀一致的次数 | 技巧题
46 1
|
5月前
leetcode-1784:检查二进制字符串字段
leetcode-1784:检查二进制字符串字段
31 0
|
5月前
|
开发框架 .NET C#
C# | [二进制字符串] 与 [字节数组] 互相转换,一行代码就搞定! - CodePlus系列
开发中有时需要将二进制数据转换为字符串或相反。虽然.NET提供了一些用于二进制数据操作的类库,但是它们的使用有时候会比较繁琐。STTech.CodePlus是一个.NET扩展库,它提供了很多实用的扩展方法,可以帮助我们更方便地进行二进制数据操作。 在本文中,我们将介绍如何使用STTech.CodePlus扩展库实现二进制字符串和字节数组的快速互相转换。
206 0