字符串

来源:互联网 发布:c语言中char 使用 编辑:程序博客网 时间:2024/06/06 08:26

  • 字符串的定义
  • 模式匹配
  • 总结

字符串,这有什么好说的呢?不就是一个个的字符组成的嘛。
嗯……我无法反驳,毕竟是事实。

1. 字符串的定义


字符串就是由一个个的字符组成的,其定义为:由另个或多个字符顺序排列组成的有限序列,简称
一般把字符串记作S = "a0 a1 a2 ... an-1" S表示字符串的名称,引号中的ai字符序列为串值,n为字符串的长度,如果字符串长度为零,我们也有对应的名字——空串

如果一个字符串仅有一个空格,那这个字符串就不是空串,因为空格也是字符。

对于字符串,我们又细分为主串子串。对于一个主串(由自己定义,假设某个串被称为主串),则主串中的任意个连续字符组成的子序列被称为子串,其中子串在主串中第一次出现时,其首字符在主串中的序号被称为该子串在主串中的位置。

照例给个实现类:

class String{    private:        char *str;   //指向动态申请的字符串首地址        int size;   //字符串长度    public:        String(char *s = "");    //默认值是个空串        String(const String &s);    //复制构造函数        ~String();        //操作符重载,串拼接,复制,串值查找等        char & operator[] (int n);        String & operator= (const String &s);        String &operator+ (const String &s);        String &operator+ (const char *s);        String &operator+ (cahr *str, cosnt String &s);        //增删改查,输入输出等操作        int Find(char c, int start);        int FindLast(char c)const;        String Substr(int index, int count);        void Insert(const String &s, int index);        void Insert(char *s, int index);        void Remove(int index, int count);        operator char *()const;        ostream &operator<< (ostream &ostr, const String &s);        istream &operator>> (istream &istr, const String &s);        Length()const;        int IsEmpty()const;        void Clear();}

2. 模式匹配


其实这应该算是一种算法,不过这个算法倒是很好的体现了字符串的各种定义。而且在一般的文本编辑器里,查找,替换等基本操作就属于最普通的模式匹配问题。

关于模式匹配,我们可以简单的描述成在一个主串中查找一个子串。

  1. 朴素模式匹配算法
    这种算法思想很简单,就是将子串与主串内容进行比较,如果在主串中找到相同的子串,表示匹配成功,否则失败。
    朴素模式匹配

    之所以称这种算法为朴素模式算法,就是因为其实现是最简单的。

  2. 改进模式匹配算法
    这种算法实现起来要比朴素模式效率高出不少,对于上面那一种字符串的匹配算法,我们可以发现,第一次比较后,EFG与ABC均不相同,所以后面两个从B和C开始继续比较就显得用处不大了,因为一定是不匹配的(B≠E,C≠E),所以我们可以舍弃这两次的匹配,直接从主串的D位置开始继续进行比较,发现DEF与EFG按顺序比较后完全不同,但是DEF的E与EFG中的E相等,所以此次主串只需向后移一位再次进行比较即可,发现匹配成功,算法结束。
    改进图1
    改进图2

    这个改进算法是我随手写的……和那个KMP算法好像有些不同。

3. 总结


其实在知道了字符串的定义之后,很多函数,如计算字符串长度,复制字符串,对字符串进行拼接、裁剪等操作函数的底层实现就多少都了解些了。
字符串在非数值计算问题处理方面,就是指模式匹配这种领域中应用的还是比较广泛的。

弄懂字符串的定义之后,即使写不出标准库中的字符串函数,写个可以跑起来的字符串函数应该还是没问题的。