数据结构之串

0. 发一下个人感想:

       作为一个大三学生,呀,不不不,快失业的社会人士,本来打算一天一章博客,从数据结构开始,到操作系统,计算机网络,数据库,线性代数,概率论,算法等方面的知识进行介绍,大一大二打了两年的ACM,最好的成绩居然是省赛三等奖和校赛一等奖的时候就果断放弃了ACM的道路,只能怪自己懂得太慢,不过还来得及,想学习,什么时候都不算晚。之后我会对我这两年来走过的ACM做次总结以及个别简单题目的分析和代码实现,基础知识完成之后,在慢慢讲一些我学到的机器学习,深度学习以及Spring的知识,希望大家能多多支持。此外,也希望能给那些还在迷茫的人一些建议,Find your dream,Never let go。

       此外,由于最近放假,乡下人嘛,也没有什么地方可以放电脑就没再更新博客,之后会陆续更新,希望大家多多支持。

华丽的开始:

1. 介绍:

       串是由零个或多个字符组成的有限序列,一般记为s=a1a2a3a4...an。串中字符的个数称为串的长度,串中任意个连续的字符组成的子序列称为子串。包含子串的串相应的为主串。两个串是相同的,当且仅当这两个串的值是相同的。

2. 串的功能介绍:

       一个串,简单地说,比如C++的string,Java的Spring,它们都是特别常用的库和对象。一般包含以下的功能:

              创建串,复制串,串的长度,串是否为空,串的基本操作符运算,清空串,子串所在的首个位置,子串所在的最后一个位置等功能。

       (1) 类的基本定义模板:

class String
{
public:
    String();
    String(const char *ch);
    String(const String &st);
    ~String();
    int length();
    bool empty();
    void clear();
    char& operator[](int index);
    bool operator==(const String &s) const;
    bool operator<=(const String &s) const;
    bool operator>=(const String &s) const;
    String& operator=(const String st);
    String& operator=(const char *st);
    String operator+(const String st);
    String operator+(const char* st);
    String& operator+=(const String st);
    String& operator+=(const char *st);
    bool operator<(const String s) const;
    bool operator>(const String s) const;
    friend ostream & operator<<(ostream &os,const String &s);
    friend istream & operator>>(istream &is,String &st);
private:
    int len;
    char *str;
};

       (2) 串的基本运算:

       串的相加(+,+=):对于相加,返回一个新的串,然后再根据其他操作操作该字符串。相加赋值运算就直接修改函数所有者。

String String::operator+(const String st)
{
    char *temp = new char[len + st.len +1];
    for(int i=0;i<len;i++) temp[i] = str[i];
    for(int i=0;i<st.len;i++) temp[i + len] = st.str[i];
    temp[len + st.len] = '\0';
    return String(temp);
}

String String::operator+(const char* st)
{
    char *temp = new char[len + strlen(st) +1];
    for(int i=0;i<len;i++) temp[i] = str[i];
    for(int i=0;i<strlen(st);i++) temp[i + len] = st[i];
    temp[len + strlen(st)] = '\0';
    return String(temp);
}

String& String::operator+=(const String st)
{
    char *temp = new char[len + st.len +1];
    for(int i=0;i<len;i++) temp[i] = str[i];
    for(int i=0;i<st.len;i++) temp[i + len] = st.str[i];
    len = len + st.len;
    delete[] str;
    str = new char[len];
    strcpy(str,temp);
    delete[] temp;
    return *this;
}

String& String::operator+=(const char *st)
{
    char *temp = new char[len + strlen(st) +1];
    for(int i=0;i<len;i++) temp[i] = str[i];
    for(int i=0;i<strlen(st);i++) temp[i + len] = st[i];
    temp[len + strlen(st)] = '\0';
    len = len + strlen(st);
    delete[] str;
    str = new char[len];
    strcpy(str,temp);
    delete[] temp;
    return *this;
}

       串的等于(=):直接修改原来的串。注意,不要直接将指针地址赋值给字符串,因为这样当这个指针地址被delete时,该字符串里面的内容也被delete,这不符合字符串的操作。

String& String::operator=(const String st)
{
    if(this == &st)
        return *this;

    delete[] str;
    len = st.len;
    str = new char[len+1];
    strcpy(str,st.str);
    return *this;
}

String& String::operator=(const char *st)
{
    delete[] str;
    len = strlen(st);
    str = new char[len+1];
    strcpy(str,st);
    return *this;
}

       串的比较(>,<,==):串的比较函数比较简单,可以参考《C++ prime plus 第六版》第十二章。这些都可以用来练C++的功底。

bool String::operator==(const String &s) const
{
    if(s.len != len) return false;
    if(strcmp(s.str,str) != 0) return false;
    return true;
}

bool String::operator<=(const String &s) const
{
    if(s.len < len) return false;
    if(strcmp(str,s.str) > 0) return false;
    return true;
}

bool String::operator>=(const String &s) const
{
    if(s.len > len) return false;
    if(strcmp(str,s.str) < 0) return false;
    return true;
}

bool String::operator<(const String s) const
{
    if(len < s.len) return true;
    if(len == s.len && strcmp(str,s.str) < 0) return true;
    return false;
}

bool String::operator>(const String s) const
{
    if(len > s.len) return true;
    if(len == s.len && strcmp(str,s.str) > 0) return true;
    return false;
}

       串的数组取值([]):这个也比较简单,直接返回就OK了。

char& String::operator[](int index)
{
    return str[index];
}

       (3) 串的流输入和输出

       这个也可以用来练习C++,详细可以参考《C++ Prime Plus 第六版》第十二章。

       输入最多只支持999999个字符的输入。

ostream & operator<<(ostream &os,const String &s)
{
    os << s.str;
    return os;
}

istream & operator>>(istream &is,String &st)
{
    char temp[999999];
    is.get(temp,999999);
    if(is)
        st=temp;
    while(is && is.get() != '\n')
        continue;

    return is;
}

       (4) 其他零碎的功能

       其他的诸如长度,是否为空就留给大家去练练。这与其说是数据结构,不如说是C++的补习。

3. 串的应用

       *串的应用我独自写几个博客介绍,毕竟都很难。

       (1) KMP算法以及子串查询

       (2) 最长公共子串(DP算法,暂不介绍后缀数组算法)

       (3) Manacher最长回文子串


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值