什么是字符串?


字符串被定义为字符数组。字符数组和字符串之间的区别是字符串以特殊字符“\0”结尾。

小白学算法-数据结构和算法教程:字符串数据结构_极客

下面是一些字符串示例:

“极客”、“为”、“极客”、“极客为极客”、“极客为极客”、“123极客”、“@123极客”

字符串在内存中是如何表示的?


在 C 中,可以使用字符指针或字符数组来引用字符串。当字符串被声明为字符数组时,它们的存储方式与 C 中其他类型的数组一样。例如,如果 str[] 是一个 auto 变量,则该字符串存储在堆栈段中,如果它是一个全局或静态变量,则存储在数据段等

小白学算法-数据结构和算法教程:字符串数据结构_字符串_02

下面是各种语言中字符串的表示:

Python

# 创建字符串的 Python 程序 创建字符串 创建字符串 用单引号
String1 = 'Welcome to the Hello World'
print("String with the use of Single Quotes: ") 
print(String1) 

# Creating a String 
# with double Quotes 
String1 = "I'm a Geek"
print("\nString with the use of Double Quotes: ") 
print(String1) 

# Creating a String 
# with triple Quotes 
String1 = '''I'm a Geek and I live in a world of "Hello"'''
print("\nString with the use of Triple Quotes: ") 
print(String1) 

# Creating String with triple 
# Quotes allows multiple lines 
String1 = '''Geeks 
			For 
			Life'''
print("\nCreating a multiline String: ") 
print(String1) 

Javascript

<!DOCTYPE html> 
<html> 
<head> 
	<title> 
		JavaScript Strings 
	</title> 
</head> 
<body> 
	<h1>GeeksforGeeks</h1> 
	<h2>JavaScript Strings</h2> 
	<p id="GFG"></p> 
	<script> 
		var x = "Welcome to GeeksforGeeks!"; 
		document.getElementById("GFG").innerHTML = x; 
	</script> 
</body> 
</html>

Java

// Java代码示例,用于说明字符串
import java.io.*; 
import java.lang.*; 

class Test { 
	public static void main(String[] args) 
	{ 
	// 声明字符串时不使用 new 操作符
		String s = "hello world"; 

		// 打印字符串 
		System.out.println("String s = " + s); 

		// 使用 new 操作符声明字符串
		String s1 = new String("demo for demo"); 

		// 打印字符串
		System.out.println("String s1 = " + s1); 
	} 
}

对字符串执行的一般操作:

这里我们为您提供一些必须了解的字符串概念:

1. 字符串连接

将多个字符串组合在一起的过程称为串联。字符串连接是组合两个字符串的技术。 

小白学算法-数据结构和算法教程:字符串数据结构_子字符串_03


连接两个字符串有两种方法:

a) 不使用任何内置方法的字符串连接:

下面是两个字符串连接的算法伪代码:

LEN1 = LENGTH(STR1).
LEN2 = LENGTH(STR2).
SET I = 0.
Repeat Steps 5 and 6 while I < LEN1-1:
    STR3[I] = STR1[I].
   SET I = I+1.
SET J = 0.
 Repeat Steps 9 to 11 while I < (LEN1 + LEN2 - 2):
    STR3[I] = STR2[J].
   J = J+1.
  I = I+1.
Exit.

2. 在字符串中查找

对字符串执行的一个非常基本的操作是在给定的整个字符串中查找某些内容。现在,这可以是在字符串中查找给定字符,或者在另一个字符串中查找完整的字符串。

小白学算法-数据结构和算法教程:字符串数据结构_极客_04

在字符串中查找

a)查找字符串中的一个字符:

给定一个字符串和一个字符,您的任务是找到该字符在字符串中的第一个位置。这类问题是竞争性很强的编程问题,您需要找到字符串中字符的位置。

b)在另一个字符串中查找子字符串:

考虑有一个长度为 N 的字符串和一个长度为 M 的子字符串。然后运行一个嵌套循环,其中外循环从 0 到 (NM),内循环从 0 到 M。对于每个索引,检查子字符串是否内循环遍历的字符串是否是给定的子字符串。 

3.替换字符串

很多时候,对字符串进行更正非常重要。替换字符串中的字符、单词或短语是对字符串执行的另一种非常常见的操作。

解决给定问题的最简单方法是遍历字符串S,当找到任何字符串S1作为字符串S中的子字符串时,则将其替换为S2。请按照以下步骤解决此问题:

  • 初始化字符串ans 来存储替换字符串 S 中所有出现的子字符串 S1 到 S2 后的结果字符串。
  • 使用变量 i迭代字符串 S 的字符并执行以下步骤:
  • 如果字符串S的前缀子串从索引i开始等于S1,则将字符串S2添加到字符串ans中。
  • 否则,将当前字符添加到字符串 ans 中。
  • 完成上述步骤后,打印字符串 ans 作为结果。

4. 求字符串的长度

对字符串最常见的操作之一是查找给定字符串的长度/大小。长度定义为字符串中的字符数,称为该字符串的长度。

小白学算法-数据结构和算法教程:字符串数据结构_子字符串_05

5. 修剪字符串

空格或特殊字符在字符串中很常见。

下面是一个简单的解决方案 

1) 迭代给定字符串的所有字符,执行以下操作
   a) 如果当前字符是空格,则将所有后续字符向后移动一位并减少结果字符串的长度。

上述解法的时间复杂度为O(n2)。

更好的解决方案可以在 O(n) 时间内解决它。这个想法是跟踪迄今为止看到的非空格字符的计数。 

1) 初始化 'count' = 0 (到目前为止看到的非空格字符的计数)
2) 迭代给定字符串的所有字符,执行以下操作
     a) 如果当前字符是非空格,则将此字符放在索引 'count' 处并增加 'count'
3) 最后,将 '\0' 放在索引 'count' 处

6. 字符串的反转和旋转

反向操作是交换字符串中字符的位置,使第一个字符变为最后一个,第二个字符变为倒数第二个,依此类推。

a)字符串的旋转:

小白学算法-数据结构和算法教程:字符串数据结构_字符串_06

b)反转字符串:

字符串的反转只不过是将字符串的最后一个元素替换为字符串的第一个位置。

小白学算法-数据结构和算法教程:字符串数据结构_极客_07