【数据结构与算法知识体系】字符串

一、字符串的应用领域

  • 信息处理:根据给定关键字搜索网页。
  • 基因组学:将DNA转换为由4个碱基组成的(非常长的)字符串。
  • 通信系统:发送短信、电子邮件、下载电子书时,都需要将字符串从一个地方传送到另一个地方。
  • 编程系统:程序是由字符串组成的。编译器、解释器等其他能够将程序转换为机器指令的软件都是使用复杂的字符串处理技术的重要应用软件。

二、C++中的字符串

我们可以使用C++的string类表示字符串。

C++ 提供了以下两种类型的字符串表示形式:

  • C 风格字符串
  • C++ 引入的 string 类类型
C风格字符串

C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。

下面的初始化代码效果相同:

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char greeting[] = "Hello";

您不需要把 null 字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把 ‘\0’ 放在字符串的末尾。

C++ 中有大量的函数用来操作以 null 结尾的字符串。举例如下:

#include <iostream>
#include <cstring>
 
using namespace std;
 
int main ()
{
   char str1[11] = "Hello";
   char str2[11] = "World";
   char str3[11];
   int  len ;
 
   // 复制 str1 到 str3
   strcpy( str3, str1);
   cout << "strcpy( str3, str1) : " << str3 << endl;
 
   // 连接 str1 和 str2
   strcat( str1, str2);
   cout << "strcat( str1, str2): " << str1 << endl;
 
   // 连接后,str1 的总长度
   len = strlen(str1);
   cout << "strlen(str1) : " << len << endl;
 
   return 0;
}
C++ 中的 string 类

C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。比较详细的介绍看C++ string类(C++字符串)完全攻略,想了解的更多去看reference。

#include <iostream>
#include <string>
 
using namespace std;
 
int main ()
{
   string str1 = "Hello";
   string str2 = "World";
   string str3;
   int  len ;
 
   // 复制 str1 到 str3
   str3 = str1;
   cout << "str3 : " << str3 << endl;
 
   // 连接 str1 和 str2
   str3 = str1 + str2;
   cout << "str1 + str2 : " << str3 << endl;
 
   // 连接后,str3 的总长度
   len = str3.size();
   cout << "str3.size() :  " << len << endl;
 
   return 0;
}

三、字符串游戏规则

以下的游戏规则我们就以C++的string类为例来介绍:

  • 字符:string是由一系列字符组成的。字符的类型是char。ASCII码有7位,扩展ASCII码有8位,而Unicode有16位。
  • 不可变性:string对象不可变,因此它们可以用于赋值语句、作为函数参数或返回值,而不用担心值会变化。
  • 索引:可以用[ ]取值。
  • 长度:size()方法或length属性。
  • 子字符串:可以用substr()方法得到。
  • 字符串的连接:可以用+或+=或append()函数。
  • 字符数组:char数组可以直接赋值给string类对象。string转为char数组则需要c_str()方法。具体可以看C++中字符数组与string的相互转换

四、字符串实用问题

1.字符串排序

对于许多排序应用,决定顺序的键都是字符串。

字符串排序的实现算法有几种:

  • 从右到左检查(低位优先)
  • 从左到右检查(高位优先)
  • 键索引计数法

也可以使用STL中的自定义sort函数来进行字符串数组的排序。

2.字符串查找——单词查找树

可以利用字符串特性,开发出更厉害的查找算法。当字符串作为被查找的键时会很有用。

单词查找树,也可以叫做“Trie”算法。

3.子字符串查找

字符串的一种基本操作就是子字符串查找:给定一段长度为N的文本和一个长度为M的模式字符串,在文本中找到一个和该模式相符的子字符串。解决该问题的大部分算法都可以很容易地扩展为找出文本中所有和该模式相符的子字符串、统计该模式在文本中的出现次数、找出上下文的算法。

应用场景:当你在文本编辑器或浏览器中查找某个单词时,就是在查找子字符串。事实上,该问题的原始动机就是为了支持这种查找操作。

一般来讲,模式相对于文本是很短的(M等于100或1000),而文本相对于模式是很长的(N可能等于100万或10亿)。在字符串查找中一般会对模式进行预处理来支持在文本中的快速查找。

常见算法有:

  • 暴力算法
  • KMP算法
  • Boyer-Moore算法
  • Rabin-Karp算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值