字符串

作者: 贪婪的君子 | 来源:发表于2017-07-13 21:40 被阅读14次

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

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


      朴素模式匹配

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

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


      改进图1
      改进图2

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

    3. 总结


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

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

    相关文章

      网友评论

        本文标题:字符串

        本文链接:https://www.haomeiwen.com/subject/hspghxtx.html