正在载入交互式动画窗口请稍等
朴素模式匹配 可视化交互式动画版
什么是字符串?
字符串通常被视为一种 数据类型 ,通常表示为存储字符序列的字节(或字)数组。 字符串被定义为 字符数组 。 字符数组和字符串的区别在于字符串以特殊字符 “\0”结尾
下面是一些字符串示例:
“图码”、“数据结构”、“算法”、“图码图码”、“图码是图码””
字符串在内存中是如何表示的?
在 C 中,可以使用字符指针或字符数组来引用字符串。 当字符串被声明为字符数组时,它们的存储方式与 C 中其他类型的数组一样。例如,如果 str[] 是一个 auto 变量,则该字符串存储在堆栈段中,如果它是一个全局或静态变量,则存储在数据段等
如何在各种语言中声明字符串?
下面是各种语言中字符串的表示:
- C++
- C
- Java
- Python
- C#
- JavaScript
- PHP
C++
// C++ program to demonstrate String // using Standard String representation #include <iostream> #include <string> using namespace std; int main() {
// Declare and initialize the string string str1 = "Welcome to 图码!" ;
// Initialization by raw string string str2( "A Computer Science Portal" );
// Print string cout << str1 << endl << str2;
return 0; } |
C
Java
Python
C#
Javascript
PHP
对字符串执行的一般操作:
这里我们为您提供一些必须了解的字符串概念:
1. 字符串连接
将多个字符串组合在一起的过程称为串联。 字符串连接是组合两个字符串的技术。
连接两个字符串有两种方法:
a) 不使用任何内置方法的字符串连接:
下面是两个字符串连接的算法:
算法:连接(STR1、STR2、STR3)
1. LEN1 = 长度(STR1)。 2. LEN2 = 长度(STR2)。 3. 设置 I = 0。 4. 当 I < LEN1-1 时重复步骤 5 和 6: 5. STR3[I] = STR1[I]。 6.设置I=I+1。 7. 设置 J = 0。 8. 当 I < (LEN1 + LEN2 - 2) 时,重复步骤 9 至 11: 9. STR3[I] = STR2[J]。 10.J=J+1。 11.我=我+1。 12.退出。
b) 使用内置方法进行字符串连接:
- C/C++ 中的字符串连接
- Java中的字符串连接
- Python 中的字符串连接
- C# 中的字符串连接
- JavaScript 中的字符串连接
2. 在字符串中查找
对字符串执行的一个非常基本的操作是在给定的整个字符串中查找某些内容。 现在,这可以是在字符串中查找给定字符,或者在另一个字符串中查找完整的字符串。
a) 查找字符串中的一个字符 :
给定一个字符串和一个字符,您的任务是找到该字符在字符串中的第一个位置。 这类问题是竞争性很强的编程问题,您需要找到字符串中字符的位置。
b) 在另一个字符串中查找子字符串 :
考虑有一个长度为 N 的字符串和一个长度为 M 的子字符串。然后运行一个嵌套循环,其中外循环从 0 到 (NM),内循环从 0 到 M。对于每个索引,检查子字符串是否内循环遍历的字符串是否是给定的子字符串。
一个有效的解决方案是使用 O(n) 搜索算法,如 KMP 算法 、 Z 算法 等。
语言实现:
- Java子串
- C++ 中的 substr
- Python查找
3.替换字符串
很多时候,对字符串进行更正非常重要。 替换字符串中的字符、单词或短语是对字符串执行的另一种非常常见的操作。
解决给定问题的最简单方法是 遍历字符串 S,当找到任何字符串S1作为字符串S中的子字符串时,则将其替换为S2。 请按照以下步骤解决此问题:
- 初始化 字符串 ans 来存储 替换字符串 S 中所有出现的子字符串 S1 到 S2 后的结果 字符串。
-
使用变量 i迭代字符串 S 的字符
并执行以下步骤:
- 如果字符串S的 前缀子串 从索引i开始等于S1,则将字符串S2添加到字符串 ans 中。
- 否则,将当前字符添加到字符串 ans 中。
- 完成上述步骤后,打印字符串 ans 作为结果。
4. 求字符串的长度
对字符串最常见的操作之一是查找给定字符串的长度/大小。 长度定义为字符串中的字符数,称为该字符串的长度。
连接两个字符串有两种方法:
a )不使用任何内置方法的字符串长度:
下面是求两个字符串长度的算法:
1. 设置 LEN = 0 且 I = 0。 2. 当 STRING[I] 不为 NULL 时,重复步骤 3 至 4: 3. LEN = LEN + 1。 4. 设置 I = I + 1。 5. 退出。
b) 使用内置方法的字符串长度:
- C语言中字符串的长度
- C++中字符串的长度
- Java中字符串的长度
- Python 中字符串的长度
- C#中字符串的长度
- JavaScript 中字符串的长度
5. 修剪字符串
空格或特殊字符在字符串中很常见。 因此,了解如何修剪 String 中的此类字符 非常重要 。
下面是一个简单的解决方案
1) 迭代给定字符串的所有字符,执行以下操作
a) 如果当前字符是空格,则将所有后续字符向后移动一位并减少结果字符串的长度。
上述解法的时间复杂度为O(n2)。
更好的解决方案可以在 O(n) 时间内解决它。 这个想法是跟踪迄今为止看到的非空格字符的计数。
1) 初始化 'count' = 0 (到目前为止看到的非空格字符的计数)
2) 迭代给定字符串的所有字符,执行以下操作
a) 如果当前字符是非空格,则将此字符放在索引 'count' 处并增加 'count'
3) 最后,将 '\0' 放在索引 'count' 处
6. 字符串的反转和旋转
反向操作是交换字符串中字符的位置,使第一个字符变为最后一个,第二个字符变为倒数第二个,依此类推。
a) 字符串的旋转 :
考虑一个字符串“geeks”,现在所有可能的旋转将是:
- 极客
- 埃克斯格
- 埃克斯盖
- 克斯吉
- 极客
b) 反转字符串 :
字符串的反转只不过是将字符串的最后一个元素替换为字符串的第一个位置。
7. 字符串的子序列
子 序列 是可以通过删除零个或多个元素从另一个序列导出的序列,而不改变剩余元素的顺序。
更一般地,我们可以说,对于大小为 n 的序列,总共可以有 (2n-1) 个非空子序列。
例如,考虑字符串“geeks”,有 15 个子序列。
他们是:
g、e、e、k、s、 ge、ge、gk、gs、ee、ek、es、ek、es、ks、 哎呀,gek,ges,gek,ges,gks,eek,ees,eks,eks, 极客, 哎呀, eeks, 极客
8. 字符串的子串
子 字符串 是字符串的连续部分,即一个字符串位于另一个字符串中。
一般来说,对于大小为n的字符串,有n*(n+1)/2个非空子串。
例如,考虑字符串“geeks”,有 15 个非空子字符串。
子数组是:
g、ge、gee、极客、极客、 e、ee、eek、eeks、 埃、埃克、埃克斯、 k、ks、 克
9. 二进制字符串
二进制字符串是一种特殊的字符串,仅由两种类型的字符组成,例如 0 和 1。
例如:
输入:str =“01010101010” 输出:是的,它是一个二进制字符串 输入:str =“geeks101” 输出:不,它不是二进制字符串
10. 回文字符串
如果字符串的反转与该字符串相同,则称该字符串为回文。
例如,
“abba”是回文,但“abbc”不是回文。
11. 词典模式
字典顺序模式是基于 ASCII 值的模式,或者可以按字典顺序表示。 我们将字符的字典顺序视为它们的 ASCII 值的顺序。 因此字符的字典顺序将是
“A”、“B”、“C”、...、“Y”、“Z”、“a”、“b”、“c”、...、“y”、“z”。
12. 模式搜索
模式搜索是在字符串中搜索给定的模式。 这是字符串的高级主题。 模式搜索算法有时也称为字符串搜索算法,并被视为字符串算法的一部分。 这些算法在搜索另一个字符串中的字符串的情况下非常有用。
热门理论面试问题
编号 | 问题 | 回答 |
---|---|---|
1 | 创建字符串对象有哪些不同的方法? | 看法 |
2 | 我们可以使用 == 运算符来比较字符串吗? 有什么风险? | 看法 |
3 | 如何将字符串中的子字符串替换为 ( ? | 看法 |
4 | java中String和StringBuffer有什么区别? | 看法 |
5 | 如何将任意基数的数字的字符串版本转换为整数? | 看法 |
6 | Java 中如何比较两个字符串? | 看法 |
7 | 数据结构中的字符串是什么? | 看法 |
8 | 字符串与字符数组有什么区别? | 看法 |
9 | 什么是空终止字符串? | 看法 |
10 | 使用堆栈反转字符串 | 看法 |
11 | String、StringBuffer 和 StringBuilder 之间的区别? | 看法 |
12 | 为什么 Java 中的 String 是不可变的或最终的 | 看法 |
13 | 什么是字符串常量池? | 看法 |
14 | 删除无效括号 | 看法 |
15 | substring() 方法有什么用? | 看法 |
16 | 解释如何从字符串中删除尾随空格 | 看法 |
17 号 | 解释如何将字符串填充到已知长度 | 看法 |
18 | 解释一下如何判断两个字符串是否相同 | 看法 |
19 | 如何检查字符串是否为空? | 看法 |
20 | 我们可以在java中的switch case中使用字符串吗? | 看法 |
21 | Java 中如何使用 + 运算符进行字符串连接? | 看法 |
22 | Java 中有哪些不同的字符串方法? | 看法 |
23 | StringJoiner 是什么意思? | 看法 |
24 | 如何将列表的字符串表示形式转换为列表? | 看法 |
26 | 如何在 C++ 中标记字符串? | 看法 |
27 | 打印字符串的所有排列? | 看法 |
28 | 如何就地反转给定的字符串? | 看法 |
29 | 如何将字节数组转换为字符串? | 看法 |
30 | 如何计算字符串中元音的总数? | 看法 |
31 | 编写一个程序将字符串转换为小写 | 看法 |
32 | 编写一个程序将字符串转换为大写。 | 看法 |
33 | 编写一个 C++ 程序来查找字符串的长度。 | 看法 |
34 | 两个字符串是否是anagrams应该以什么方式进行比较来确定 | 看法 |
35 | 编写一个java程序来切换字符串中的每个单词? | 看法 |
36 | java中如何将字符串转换为日期? | 看法 |
37 | Java程序反转给定的字符串并保留空格的位置 | 看法 |
38 | 将表示为字符串的大数相乘 | 看法 |
39 | 字符串“indexOf”方法 | 看法 |
前 50 个面试编码问题
字符串上的简单问题
编号 | 问题 | 实践 |
---|---|---|
1 | 反转给定字符串中的单词 | 关联 |
2 | 最长公共前缀 | 关联 |
3 | 罗马数字转整数 | 关联 |
4 | 整数转罗马 | 关联 |
5 | 最近的字符串 | 关联 |
6 | 可被 7 整除 | 关联 |
7 | 加密字符串 – II | 关联 |
8 | 括号串中的等点 | 关联 |
9 | 同构弦 | 关联 |
10 | 检查两个字符串是否是 k 字谜 | 关联 |
11 | 全字词检查 | 关联 |
12 | 检查字符串是否旋转了两个位置 | 关联 |
弦上的中等问题
编号 | 问题 | 实践 |
---|---|---|
1 | 最少删除 | 关联 |
2 | 不同子序列的数量 | 关联 |
3 | 实施Atoi | 关联 |
4 | 验证 IP 地址 | 关联 |
5 | 许可证密钥格式 | 关联 |
6 | 查找字典中最大的单词 | 关联 |
7 | 等于 0,1 和 2 | 关联 |
8 | 在字符串中查找并替换 | 关联 |
9 | 添加二进制字符串 | 关联 |
10 | 两个大数的和 | 关联 |
11 | 两个字符串相乘 | 关联 |
12 | 边看边说模式 | 关联 |
13 | 使 B 成为子串所需重复 A 的最少次数 | 关联 |
14 | Excel 工作表 – I | 关联 |
15 | 形成一个回文 | 关联 |
16 | 找到第N个字符 | 关联 |
17 号 | 使用同一组数字的下一个更高的回文数 | 关联 |
18 | 最长前缀后缀的长度 | 关联 |
19 | 最长的K个唯一字符子串 | 关联 |
20 | 包含所有字符的字符串中的最小窗口 | 关联 |
21 | 最长回文子序列 | 关联 |
22 | 没有重复字符的最长子串 | 关联 |
23 | 长度为 k 且具有 k-1 个不同元素的子串 | 关联 |
24 | 计算子串的个数 | 关联 |
25 | 交错字符串 | 关联 |
26 | 一起打印 Anagrams | 关联 |
27 | 对排列进行排序 | 关联 |
28 | 特殊键盘 | 关联 |
字符串难题
编号 | 问题 | 实践 |
---|---|---|
1 | 限制性糖果粉碎传奇 | 关联 |
2 | 编辑距离 | 关联 |
3 | 搜索模式(KMP-算法) | 关联 |
4 | 搜索模式(Rabin-Karp 算法) | 关联 |
5 | 搜索模式(Z算法) | 关联 |
6 | 最短公共超序列 | 关联 |
7 | 具有 K 个最大不同元音的单词数 | 关联 |
8 | 形成回文的最长子串 | 关联 |
9 | 最长有效括号 | 关联 |
10 | 不同的回文子串 | 关联 |
使用字符串的优点:
- 多功能性: 字符串可以存储和操作文本数据,使其可用于广泛的应用程序和编程任务。
- 可读性: 字符串可以清晰地表示和解释人类可读的文本,使代码更易于理解和维护。
- 易于使用: 字符串操作操作(例如连接、搜索和替换)通常很简单,并且受到许多编程语言的支持。
- 文本处理: 字符串提供了搜索、匹配和操作文本模式的有效操作,这对于解析、数据提取和文本分析等任务非常有价值。
字符串的缺点:
- 字符串在执行输入、输出等操作时通常很慢。
- 在 JAVA 中,字符串是不可变的,无法修改或更改
- 在 JAVA 中,您无法扩展字符串类,这意味着不可能重写字符串类中的方法。
- C 字符串的大小是固定的,不是动态的。
字符串的应用:
- 文本处理: 字符串广泛用于文本处理任务,例如搜索、操作和分析文本数据。
- 数据表示 :字符串是表示和操作 JSON、XML 和 CSV 等格式的数据的基础。
- 加密和哈希: 字符串通常用于加密和哈希算法,以保护敏感数据并确保数据完整性。
- 数据库操作: 字符串对于使用数据库至关重要,包括存储和查询基于文本的数据。
- Web 开发: Web 开发中使用字符串来构建 URL、处理表单数据、处理来自 Web 表单的输入以及生成动态内容。
重要要点:
- 在许多编程语言中,字符串是不可变的。
关于 String 的常见问题 (FAQ)
1.字符串是线性数据结构吗?
是的,字符串是一种线性数据结构。
2. 字符串用在什么地方?
它用于存储字符序列。
3. string是一种数据类型吗?
字符串通常被认为是一种数据类型,并且通常被实现为字节(或字)的数组数据结构,它使用某种字符编码存储元素序列(通常是字符)。
4. 为什么文本被称为字符串?
文本也称为字符串,因为它像字符串一样由字符序列组成。
5. 字符串中的字符是什么?
字符串中的每个数字都是一个字符,而字符是用于表示文本、数字或符号的单个视觉对象。
结论
经过讨论,我们得出结论:字符串是存储一些文本信息的简单方法,字符串是一个以空字符“\0”结尾的字符数组。 字符数组和字符串之间的区别在于,与字符数组不同,字符串以空字符结尾。 除此之外,我们还讨论了 热门理论面试问题 以及 热门 50 个 字符串面试编码问题,这将帮助您解决面试问题。
相关文章:
- 数组面试准备完整指南
- 每个程序员都必须了解的顶级数据结构
- SDE SHEET – SDE 准备的完整指南
- Amazon SDE 表 – Amazon SDE 面试准备指南
- 软件工程师的 Google 面试准备 – 完整指南