字符串简介
字符串实际上是一个 unicode 字符
数组。可以执行几乎所有我们在数组中使用的操作。
然而,二者之间还是存在一些区别。在这篇文章中,将介绍一些在处理字符串时应该注意的问题。这些特性在不同的语言之间可能有很大不同。
比较函数
字符串有它自己的 比较函数
。
然而,存在这样一个问题:
我们可以用 “==” 来比较两个字符串吗?
这取决于下面这个问题的答案:
我们使用的语言是否支持 运算符重载
?
- 如果答案是 yes (例如 C++)。我们可以使用
==
来比较两个字符串。 如果答案是 no (例如 Java),我们可能无法使用
==
来比较两个字符串。当我们使用==
时,它实际上会比较这两个对象是否是同一个对象。是否可变
不可变意味着一旦字符串被初始化,你就无法改变它的内容。
在某些语言(如 C ++)中,字符串是可变的。 也就是说,你可以像在数组中那样修改字符串。
- 在其他一些语言(如 Java)中,字符串是不可变的。 此特性将带来一些问题。
可以通过 测试修改操作
来确定语言中的字符串是否可变。这里有一个示例:
#include <iostream>
int main() {
string s1 = "Hello World";
s1[5] = ',';
cout << s1 << endl;
}
不可变字符串 —— 问题和解决方案
修改操作
不可变字符串无法被修改。哪怕你只是想修改其中的一个字符,也必须创建一个新的字符串。
小心 Java 中的字符串
你应该非常小心 字符串连接
。
如果在一个字符串不可变的语言中使用
字符串连接
性能是很差的(尤其是在 for循环 中使用)。
在 Java 中,由于字符串是不可变的,因此在连接时首先为新字符串分配足够的空间,复制旧字符串中的内容并附加到新字符串。
因此,如果在 Java for循环中使用字符串拼接 总时间复杂度将是:$O(n^2)$
。
解决方案
如果你确实希望你的字符串是可变的,则可以将其转换为字符数组
如果你经常必须连接字符串,最好使用一些其他的数据结构,如 StringBuilder
。
其他
你应该了解一些字符串内置函数的时间复杂度。
例如,如果字符串的长度是 N
,那么查找操作和子字符串操作的时间复杂度是 。
此外,在字符串不可变的语言中,你应该额外小心连接操作。
在计算解决方案的时间复杂度时,不要忘记考虑内置操作的时间复杂度。
二维数组简介
每种语言对二维数组底层的处理方式不同,了解这些可以让我们在设计的时候有更多的 idea。
C++ 将二维数组存储为一维数组
下图显示了大小为 M * N
的数组 A
的实际结构:
因此,如果我们将 A 定义为也包含 M * N
个元素的一维数组,那么实际上 A[i][j]
就等于 A[i * N + j]
。
Java中,二维数组实际上是包含着 M 个元素的一维数组,每个元素都是包含有 N 个整数的数组
原文
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/