2023 跟我一起学数据结构与算法:字符串(下)
上一篇(2023 跟我一起学数据结构与算法:字符串(上))中我们介绍了字符串的内存存储以及基本的查找,拼接,替换等操作,本篇文章我们介绍下字符串在编程中的应用以及优缺点。
字符串的应用、优点和缺点
- 字符串数据结构是编程语言的支柱和通信的构建块**。**字符串数据结构是计算机科学和编程中最基本、最广泛使用的工具之一。它们允许以多种方式表示和操作文本和字符序列。字符串数据结构是一个强大的工具,可以用来存储和处理大量的文本数据,从简单的字符串到复杂的句子、段落,甚至整本书。
- 它是表示文本或其他形式的数据的字符序列。它是一种基本数据结构,在许多编程语言中用于存储和操作基于文本的数据。在大多数编程语言中,字符串被实现为字符数组,每个字符在数组中都有唯一的索引位置。
字符串的应用:
- 匹配检查器:字符串可用于使用字符串匹配算法在很短的时间内查找代码和内容中的抄袭行为。使用这个,计算机可以轻松地告诉我们代码的百分比,以及任意两个用户编写的文本匹配的百分比。
- 编码/解码(密文生成):字符串可用于编码和解码,以确保数据从发送者到接收者的安全传输,以确保传输过程中没有人能够读取您的数据,因为它们可以执行主动和被动操作攻击。您作为消息传输的文本在发送者端被加密,并在接收者端被解码。
- 信息检索:字符串应用程序帮助我们从未知数据源(用作输入的大型数据集)检索信息,并借助字符串匹配/检索模块帮助我们检索重要信息。
- 针对近似后缀-前缀重叠问题的改进过滤器:字符串及其算法应用帮助我们为近似后缀-前缀重叠问题提供改进的过滤器。近似后缀-前缀重叠问题是从给定集合中查找所有字符串对,使得一个字符串的前缀与另一个字符串的后缀相似。
- 网络通信:字符串用于对通过网络发送的数据进行编码和解码,例如 HTTP 请求和响应。
- 文件处理:字符串用于操作文件路径和名称,以及读取和写入文件。
- 数据分析:字符串可用于从大量文本数据中提取有意义的见解,例如自然语言处理和情感分析。
字符串的优点:
- 文本处理:字符串用于表示编程语言中的文本。它们可用于以各种方式操纵和处理文本,例如搜索、替换、解析和格式化。
- 数据表示:字符串可用于表示其他数据类型,例如数字、日期和时间。例如,您可以使用字符串来表示"YYYY-MM-DD"格式的日期,或"HH:MM:SS"格式的时间。
- 易于使用:字符串易于使用和操作。它们可以被连接、切片和反转等。它们还具有简单直观的语法,使所有技能水平的程序员都可以使用它们。
- 兼容性:字符串在各种编程语言中广泛使用,使其成为通用数据类型。这意味着字符串可以在不同的系统和平台之间轻松传输,使其成为可靠且高效的通信和共享数据的方式。
- 内存效率:字符串通常存储在连续的内存块中,这使得它们的分配和释放效率很高。这意味着它们可以用来表示大量数据而不占用太多内存。
字符串的缺点:
- 内存消耗:字符串可能会消耗大量内存,尤其是在处理大字符串或许多字符串时。这在内存受限的环境中可能是一个问题,例如嵌入式系统或移动设备。
- 不变性:在许多编程语言中,字符串是不可变的,这意味着它们一旦创建就无法更改。当处理需要频繁修改的大型或复杂字符串时,这可能是一个缺点,因为它可能导致效率低下和内存开销。
- 性能开销:字符串操作可能比其他数据类型的操作慢,尤其是在处理大型或复杂的字符串时。这是因为字符串操作通常涉及复制和重新分配内存,这可能非常耗时。
- 编码和解码开销:字符串可以具有不同的字符编码,这可能会导致在它们之间进行转换时产生开销。当处理来自不同源的数据或与使用不同编码的系统通信时,这可能会成为问题。
- 安全漏洞:如果处理不当,字符串可能容易受到安全漏洞的影响,例如缓冲区溢出或注入攻击。这是因为攻击者可以操纵字符串来执行任意代码或访问敏感数据。
实战:
给定一个字符串s和S 中存在的两个单词w1和w2 。任务是找到w1和w2之间的最小距离。这里,距离是第一个和第二个单词之间的步数或单词数。
Examples:
Input : s = "geeks for geeks contribute practice", w1 = "geeks", w2 = "practice"
Output : 1
最接近的 w1 和 w2 之间只有一个单词。
Input : s = "the quick the brown quick brown the frog", w1 = "quick", w2 = "frog"
Output : 2
go
func TestD(t *testing.T) {
// var s = "geeks for geeks contribute practice"
// var w1, w2 = "geeks", "practice"
var s = "the quick the brown quick brown the frog"
var w1, w2 = "quick", "frog"
sl := strings.Split(s, " ")
var start int
var ll int
for i := 0; i < len(sl); i++ {
if sl[i] == w1 {
start = i
continue
}
if sl[i] == w2 && (i-start) <= start {
ll = i - start - 1
}
}
fmt.Println(ll)
}
解读:
我们首先需要将字符串 Input 转换为数组(这样操作就简单了),然后遍历数组找到匹配 w1 的字符串并记录下他在数组中的索引 index ,当匹配到第二个单词 w2 的时候,我们计算距离长度 ll 。 条件 (i-start) <= start
是必须的, 也是其中的奥秘,大家可以探索下为什么。
- 时间复杂度:我们使用了一个 for 来循环 Input , 循环的次数取决于 Input 字符串的长度。所以时间复杂度为 O(n);
- 空间复杂度:我们定义了 sl 数组, 来保存字符串转换过的数组。所以空间复杂度为 O(n)