数据结构之串

感悟

主要是串的初始化,连接函数,赋值函数,求串的长度。求串的长度也在其中,但是我没有将其输出。还有BF算法,但是是求所有可能出现的位置,由于我是从下标0开始存的,所以与书上的不太一样。要注意一下,当获得第一个位置之后,i和j应该怎么移动。

#include <bits/stdc++.h>
using namespace std;
vector<int>V;
typedef struct {
     char *elem;
     int length;
}SString;
void init(SString &S)
{
    S.elem = new char[1001];
    S.length = 0;
}
void stringsign(SString &s)
{
    string s1;
    cin >> s1;
    for(int i = 0 ; i < s1.size(); ++i)
    {
        s.elem[i] = s1[i];
    }
    int len = s1.size();
    s.elem[len] = '\0';
    s.length = s1.size();
}
int getlength(SString s)
{
    return s.length;
}
SString connect(SString &s1,SString &s2,SString s3)
{
    for(int i = 0; i < s1.length; ++i)
    {
        if(s1.elem[i] == '\0')
            break;
        s3.elem[i] = s1.elem[i];
    }
    for(int i = 0; i < s2.length ; i++)
    {
        s3.elem[i + s1.length] = s2.elem[i];
    }
    s3.elem[s1.length + s2.length ] = '\0';
    s3.length = s1.length + s2.length;
    return s3;
}
void BF(SString s1, SString s2)
{
    int i = 0;
    int j = 0;
    while(i < s1.length)
    {
    while(i < s1.length && j < s2.length)
    {
        if(s1.elem[i] == s2.elem[j])
        {
            i++;
            j++;
        }
        else
        {
            i = i - j + 1;
            j = 0;
        }
    }
    if(j == s2.length)  V.push_back(i - j);
    i = i - j + 1;
    j = 0;
    }
}
int main()
{
    SString s,s1,s2;
    init(s);
    init(s1);
    init(s2);
    cout << "请输入子串1:" << endl;
    stringsign(s);   //字符串赋值函数
    cout << "请输入子串2:" << endl;
    stringsign(s1);
    cout << "正在输出连接后的羊肉串。" << endl;
    s2 = connect(s,s1,s2);
    for(int i = 0 ; i < s2.length; ++i)
        cout << s2.elem[i];
    cout << endl;
    cout << "请输入串1 :" << endl;
    stringsign(s1);
    cout << "请输入串2 :" << endl;
    stringsign(s2);
    cout << "正在查找串2在串1中所有出现的位置...(下标从0开始)" << endl;
    BF(s1,s2);
    if(V.size() == 0)
        cout << "没有查找到该子串." << endl;
    else
    for(int i = 0; i < V.size(); ++i)
    {
        cout << V[i] << endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值