字符串

作者: 贪婪的君子 | 来源:发表于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. 总结


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

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

相关文章

  • Javascript知识点整合

    字符串 单行字符串: ‘字符串’或“字符串” 多行字符串: `多行字符串` 字符串操作: 字符串连接‘+’号 长度...

  • C++基础字符串

    字符串的构造 字符串特性描述 字符操作 字符串赋值 字符串连接 字符串比较 字符串查找 字符串替换 字符串删除 字...

  • iOS中的NSString与NSMutableString

    字符串的创建 字符串读写 字符串的比较 字符串的搜索 字符串截取 字符串替换 字符串与路径 字符串转换 NSMut...

  • iOS NSString用法总结

    字符串属性 字符串截取 字符串比较 字符串搜索 字符串拼接 字符串基本类型转换 字符串分行,分段 字符串列举(按条...

  • php 字符串常见方法汇总

    字符串拼接 字符串检索 字符串截取 字符串替换 字符串大小写转化 字符串转数组 字符串格式化

  • iOS 字符串截取、iOS 字符串替换、iOS 字符串分隔、iO

    iOS之字符串截取、iOS 字符串替换、iOS字符串分隔、iOS之字符串匹配、截取字符串、匹配字符串、分隔字符串 ...

  • PHP中字符串函数库常用函数解析 -- PHP 学习 (十一)

    常用字符串函数分类: 字符串长度, 字符串查找, 字符串大小写转换, 字符串截取, 字符串 ASCII, 字符串加...

  • Kotlin语言(二):字符串类型

    1、字符串定义 2、字符串删除空格 3、字符串比较 4、字符串切割 5、字符串截取 6、字符串替换 7、字符串模板

  • 字符串扩展

    求字符串大小 字符串解码、转换 字符串截取 字符串汉字处理 字符串 Mac地址 字符串进制转换

  • 2020-09-30字符串

    day8-字符串 字符串的操作 in 和 not in字符串1 in 字符串2 - 判断字符串1是否是字符串...

网友评论

    本文标题:字符串

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