字符串简介

字符串实际上是一个 unicode 字符 数组。可以执行几乎所有我们在数组中使用的操作。

然而,二者之间还是存在一些区别。在这篇文章中,将介绍一些在处理字符串时应该注意的问题。这些特性在不同的语言之间可能有很大不同。

比较函数

字符串有它自己的 比较函数

然而,存在这样一个问题:

我们可以用 “==” 来比较两个字符串吗?

这取决于下面这个问题的答案:

我们使用的语言是否支持 运算符重载

  1. 如果答案是 yes (例如 C++)。我们可以使用 == 来比较两个字符串。
  2. 如果答案是 no (例如 Java),我们可能无法使用 == 来比较两个字符串。当我们使用 == 时,它实际上会比较这两个对象是否是同一个对象。

    是否可变

    不可变意味着一旦字符串被初始化,你就无法改变它的内容。

  3. 在某些语言(如 C ++)中,字符串是可变的。 也就是说,你可以像在数组中那样修改字符串。

  4. 在其他一些语言(如 Java)中,字符串是不可变的。 此特性将带来一些问题。

可以通过 测试修改操作 来确定语言中的字符串是否可变。这里有一个示例:

  1. #include <iostream>
  2. int main() {
  3. string s1 = "Hello World";
  4. s1[5] = ',';
  5. cout << s1 << endl;
  6. }

不可变字符串 —— 问题和解决方案

如果字符串是不可变的,则会带来一些问题。

修改操作

不可变字符串无法被修改。哪怕你只是想修改其中的一个字符,也必须创建一个新的字符串。

小心 Java 中的字符串

你应该非常小心 字符串连接

如果在一个字符串不可变的语言中使用 字符串连接 性能是很差的(尤其是在 for循环 中使用)。

在 Java 中,由于字符串是不可变的,因此在连接时首先为新字符串分配足够的空间,复制旧字符串中的内容并附加到新字符串。

因此,如果在 Java for循环中使用字符串拼接 总时间复杂度将是:$O(n^2)$

解决方案

如果你确实希望你的字符串是可变的,则可以将其转换为字符数组
如果你经常必须连接字符串,最好使用一些其他的数据结构,如 StringBuilder

其他

你应该了解一些字符串内置函数的时间复杂度。

例如,如果字符串的长度是 N,那么查找操作和子字符串操作的时间复杂度是 数组与字符串 - 图1

此外,在字符串不可变的语言中,你应该额外小心连接操作

在计算解决方案的时间复杂度时,不要忘记考虑内置操作的时间复杂度。

二维数组简介

每种语言对二维数组底层的处理方式不同,了解这些可以让我们在设计的时候有更多的 idea。

C++ 将二维数组存储为一维数组

下图显示了大小为 M * N 的数组 A 的实际结构:
image.png
因此,如果我们将 A 定义为也包含 M * N 个元素的一维数组,那么实际上 A[i][j] 就等于 A[i * N + j]

Java中,二维数组实际上是包含着 M 个元素的一维数组,每个元素都是包含有 N 个整数的数组

下图显示了 Java 中二维数组 A 的实际结构:
image.png

原文

https://leetcode-cn.com/explore/learn/card/array-and-string/200/introduction-to-string/777/
https://leetcode-cn.com/explore/learn/card/array-and-string/200/introduction-to-string/778/
https://leetcode-cn.com/explore/learn/card/array-and-string/199/introduction-to-2d-array/773/