字符串,这有什么好说的呢?不就是一个个的字符组成的嘛。
嗯......我无法反驳,毕竟是事实。
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. 模式匹配
其实这应该算是一种算法,不过这个算法倒是很好的体现了字符串的各种定义。而且在一般的文本编辑器里,查找,替换等基本操作就属于最普通的模式匹配问题。
关于模式匹配,我们可以简单的描述成在一个主串中查找一个子串。
-
朴素模式匹配算法
这种算法思想很简单,就是将子串与主串内容进行比较,如果在主串中找到相同的子串,表示匹配成功,否则失败。
朴素模式匹配
之所以称这种算法为朴素模式算法,就是因为其实现是最简单的。
-
改进模式匹配算法
这种算法实现起来要比朴素模式效率高出不少,对于上面那一种字符串的匹配算法,我们可以发现,第一次比较后,EFG与ABC均不相同,所以后面两个从B和C开始继续比较就显得用处不大了,因为一定是不匹配的(B≠E,C≠E),所以我们可以舍弃这两次的匹配,直接从主串的D位置开始继续进行比较,发现DEF与EFG按顺序比较后完全不同,但是DEF的E与EFG中的E相等,所以此次主串只需向后移一位再次进行比较即可,发现匹配成功,算法结束。
改进图1
改进图2
这个改进算法是我随手写的......和那个KMP算法好像有些不同。
3. 总结
其实在知道了字符串的定义之后,很多函数,如计算字符串长度,复制字符串,对字符串进行拼接、裁剪等操作函数的底层实现就多少都会有些了解了。
字符串在非数值计算问题处理方面,就是指模式匹配这种领域中应用的还是比较广泛的。
弄懂字符串的定义之后,即使写不出标准库中的字符串函数,写个可以跑起来的字符串函数应该还是没问题的。
网友评论