数据结构 串

简介: 数据结构 串

1. DS串应用–KMP算法


题目描述


学习KMP算法,给出主串和模式串,求模式串在主串的位置


算法框架如下,仅供参考


3edf5fc5a75b45bc9c19d575cce89af1.png


输入


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


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


以此类推


输出


第一行输出第1个实例的模式串的next值


第二行输出第1个实例的匹配位置,位置从1开始计算,如果匹配成功输出位置,匹配失败输出0


以此类推


输入样例


3

qwertyuiop

tyu

aabbccdd

ccc

aaaabababac

abac


输出样例


-1 0 0

5

-1 0 1

0

-1 0 0 1

8


参考代码

#include <iostream>
#include <string>
using namespace std;
class myString
{
private:
    string mainstr;
    int size;
    void getnext(string p, int next[])
    {
        int j = 0;
        int k = -1;
        next[j] = k;
        int len = p.length();
        while (j < len - 1)
        {
            if (k == -1 || p[j] == p[k])
            {
                j++;
                k++;
                next[j] = k;
            }
            else
            {
                k = next[k];
            }
        }
    }
    int KMPfind(string p, int pos, int next[])
    {
        int i = pos;
        int j = 0;
        int len = p.length();
        while (i < size && j < len)
        {
            if (j == -1 || mainstr[i] == p[j])
            {
                i++;
                j++;
            }
            else
            {
                j = next[j];
            }
        }
        if (j >= len)
            return i - len;
        else
        {
            return -1;
        }
    }
public:
    myString()
    {
        size = 0;
        mainstr = "";
    }
    ~myString()
    {
        size = 0;
        mainstr = "";
    }
    void setval(string sp)
    {
        mainstr.assign(sp);
        size = mainstr.length();
    }
    int KMPfindSubstr(string p, int pos)
    {
        int i;
        int L = p.length();
        int *next = new int[L];
        getnext(p, next);
        for (i = 0; i < L; i++)
        {
            cout << next[i] << ' ';
        }
        cout << endl;
        int v = -1;
        v = KMPfind(p, pos, next);
        delete[] next;
        return v + 1;
    }
};
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        string a, b;
        cin >> a >> b;
        myString p;
        p.setval(a);
        cout << p.KMPfindSubstr(b, 0) << endl;
    }
    return 0;
}


2. DS串应用–串替换


题目描述


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


本题只考虑一处替换的情况,如果你想做的完美一些,能够实现多处替换那


可能需要考虑模式串和替换串长度不一致的情况


输入


第一行输入先输入n表示客户数量


第二行输入每个客户的类型,数据之间用用空格隔开


第三行输入每个客户的办理时间,数据之间用用空格隔开


输出


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


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


以此类推


输入样例


3

aabbccdd

bb

ff

aaabbbccc

ddd

eee

abcdef

abc

ccccc


输出样例


aabbccdd

aaffccdd

aaabbbccc

aaabbbccc

abcdef

cccccdef


参考代码

#include <iostream>
#include <string>
using namespace std;
class myString
{
public:
    string mainstr;
    int size;
    void getnext(string p, int next[])
    {
        int j = 0;
        int k = -1;
        next[j] = k;
        int len = p.length();
        while (j < len - 1)
        {
            if (k == -1 || p[j] == p[k])
            {
                j++;
                k++;
                next[j] = k;
            }
            else
            {
                k = next[k];
            }
        }
    }
    int KMPfind(string p, int pos, int next[])
    {
        int i = pos;
        int j = 0;
        int len = p.length();
        while (i < size && j < len)
        {
            if (j == -1 || mainstr[i] == p[j])
            {
                i++;
                j++;
            }
            else
            {
                j = next[j];
            }
        }
        if (j >= len)
            return i - len;
        else
        {
            return -1;
        }
    }
    myString()
    {
        size = 0;
        mainstr = "";
    }
    ~myString()
    {
        size = 0;
        mainstr = "";
    }
    void setval(string sp)
    {
        mainstr.assign(sp);
        size = mainstr.length();
    }
    int KMPfindSubstr(string p, int pos)
    {
        int i;
        int L = p.length();
        int *next = new int[L];
        getnext(p, next);
        int v = -1;
        v = KMPfind(p, pos, next);
        delete[] next;
        return v + 1;
    }
    void replace(string p, int pos,string c)
    {
        string result = "";
        result += mainstr.substr(0, pos-1);
        result += p;
        result += mainstr.substr(pos-1+c.length(), mainstr.length());
        mainstr = result;
    }
};
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        string a, b, c;
        cin >> a >> b >> c;
        myString p;
        p.setval(a);
        cout << p.mainstr << endl;
        int num = p.KMPfindSubstr(b, 0);
        if (num != 0)
            p.replace(c, num,b);
        cout << p.mainstr << endl;
    }
}


3. DS串应用—最长重复子串


题目描述


求串的最长重复子串长度(子串不重叠)。例如:abcaefabcabc的最长重复子串是串abca,长度为4。


输入


测试次数t


t个测试串


输出


对每个测试串,输出最长重复子串长度,若没有重复子串,输出-1.


输入样例


3

abcaefabcabc

szu0123szu

szuabcefg


输出样例


4

3

-1


参考代码

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s, subr, subl;
    int t;
    int i, flag, j;
    cin >> t;
    while (t--)
    {
        cin >> s;
        int len = s.length();
        for (i = len / 2, flag = 0; i >= 1 && !flag; i--)
            for (j = 0; j < len - 2 * i; j++)
            {
                subl = s.substr(j, i);
                subr = s.substr(i + j);
                if (subr.find(subl) != string::npos)
                {
                    cout << i << endl;
                    flag = 1;
                    break;
                }
            }
        if (!flag)
            cout << -1 << endl;
    }
    return 0;
}


相关文章
|
5月前
数据结构 字符串 (第6天)
数据结构 字符串 (第6天)
|
存储 算法 JavaScript
数据结构:字符串
数据结构:字符串
88 0
|
6月前
|
算法 Java 索引
数据结构之串—字符串而不是羊肉串
数据结构之串—字符串而不是羊肉串
119 0
|
存储 Java 容器
数据结构 - 3(链表12000字详解)
数据结构 - 3(链表12000字详解)
47 0
|
存储 算法 C语言
数据结构-串
数据结构-串
103 0
|
算法 Python
数据结构|字符串匹配
数据结构|字符串匹配
93 0
|
存储 算法
【数据结构】串的定义以及算法
【数据结构】串的定义以及算法
181 0
|
存储 C# C语言
大话数据结构--串的存储结构
大话数据结构--串的存储结构
75 0
|
存储 算法
数据结构 | 串的存储结构之链串
数据结构中串的存储结构之链串,了解其基本实现及算法
145 0
数据结构 | 串的存储结构之链串
|
存储 算法 JavaScript
数据结构串
数据结构串
162 1
数据结构串