字符串(使用C++实现)

😲示例

在C++中,可以使用标准库中的string类来进行字符串的操作。下面是一些常见的字符串操作:

  1. 字符串的创建和初始化:

    • 使用赋值运算符初始化字符串:string str = "Hello";
    • 使用构造函数初始化字符串:string str("Hello");
  2. 字符串的拼接:

    • 使用加号运算符:string str1 = "Hello"; string str2 = "World"; string result = str1 + str2;
    • 使用append()函数:string str1 = "Hello"; string str2 = "World"; str1.append(str2);

    需要注意的是,append()函数会修改调用它的字符串对象,而不会创建一个新的字符串对象。

  3. 字符串的比较:

    • 使用比较运算符:string str1 = "Hello"; string str2 = "World"; if (str1 == str2) { /* 字符串相等 */ }
    • 使用compare()函数:string str1 = "Hello"; string str2 = "World"; if (str1.compare(str2) == 0) { /* 字符串相等 */ }
  4. 字符串的长度:

    • 使用size()函数:string str = "Hello"; int length = str.size();
  5. 字符串的查找和替换:

    • 查找单个字符:string str = "hello"; char a = str[0];
    • 使用find()函数查找子串:string str = "Hello World"; int pos = str.find("World");
    • 使用replace()函数替换子串:string str = "Hello World"; str.replace(6, 5, "C++");
  6. 字符串的截取和分割:

    • 使用substr()函数截取子串:string str = "Hello World"; string sub = str.substr(6, 5);
    • 使用stringstream类分割字符串:string str = "Hello,World,C++"; stringstream ss(str); string token; while (getline(ss, token, ',')) { /* 分割字符串 */ }

🤔一些疑问解答

字符串不算是基本数据类型, 那么能不能想vector那样改变大小呢?

可以, 使用resize()函数可以改变大小, 将会再数组后面扩充空白空间

resize()函数改变大小的一些细节, 比如增加长度的字符串是从前面增加还是后面, 增加的内容是随机的还是有默认值

在C++中,std::string是一个用于处理字符串的标准库类。std::string类提供了许多有用的成员函数,其中之一是resize()函数。

resize()函数用于改变std::string对象的大小,即修改字符串的长度。它接受一个参数,该参数指定了调整后的字符串长度。

resize()函数有两种用法:

  1. 如果指定的长度大于当前字符串的长度,resize()函数将在末尾添加足够数量的字符来达到指定的长度。新添加的字符将被初始化为默认值,即空字符('\0')。
    例如:

    1
    2
    3
    std::string str = "Hello";
    str.resize(8); // 将字符串长度调整为8
    std::cout << str; // 输出:Hello\0\0\0
  2. 如果指定的长度小于当前字符串的长度,resize()函数将截断字符串,使其长度符合指定的长度。

    例如:

    1
    2
    3
    std::string str = "Hello, World!";
    str.resize(5); // 将字符串长度调整为5
    std::cout << str; // 输出:Hello

此外,还可以使用resize()函数的第二个可选参数来指定新添加字符的值

例如:

1
2
3
std::string str = "Hello";
str.resize(8, '!'); // 将字符串长度调整为8,并用'!'字符填充
std::cout << str; // 输出:Hello!!!

💪力扣刷题

344. 反转字符串

力扣传送门

1
2
3
4
5
6
7
8
9
class Solution {
public:
void reverseString(vector<char>& s) {
int len = s.size();
for(int i=0; i<len/2; i++){
swap(s[i],s[len-i-1]);
}
}
};

541. 反转字符串 II

力扣传送门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
string reverseStr(string s, int k) {
int count = 0;
int len = s.size();
int left,right;
int flag = 0;
while(flag<len){
left = flag;
while(count<2*k && flag<len){
count++;
flag++;
}
right = left+min(count,k)-1;
while(left<right){
swap(s[left++],s[right--]);
}
count = 0;
}
return s;
}
};

剑指 Offer 05. 替换空格

力扣传送门

先数出有多少个空格, 再增加字符串的大小
新的字符串使用两个指针从后往前改造, 前面的给后面提供值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
for(char i:s)
if(i==' ')
count++;
int left = s.size()-1;
s.resize(s.size()+count*2);
int right = s.size()-1;
while(left!=right){
if(s[left]!=' ')
s[right--] = s[left--];
else{
s[right--] = '0';
s[right--] = '2';
s[right--] = '%';
left--;
}
}
return s;
}
};

151. 反转字符串中的单词

力扣传送门

  1. 去掉头尾和中间的多余空格
  2. 把整个字符串反转
  3. 把每个单词依次反转
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
class Solution {
public:
string reverseWords(string s) {
int len = s.size();
// left定位第一个单词的头
int left = 0;
while(left<len && s[left]==' ')
left++;
// right定位到最后一个单词的尾
int right = len-1;
while(right>left && s[right]==' ')
right--;
// 统计中间有多少单词和空格, 其中连续空格只记一次
int flag = left;
int count = 0;
while(flag<=right){
if(s[flag]!=' '){ // 不是空格
count++;
flag++;
}
else{ // 是空格
count++; // 记一次
while(flag <= right && s[flag]==' ')// 找到下一个单词的头
flag++;
}
}
// 把长的字符串搬移到前count个位置上
int slow=0, fast=left;
while(fast<=right){
if(s[fast]!=' '){
s[slow] = s[fast];
slow++;
fast++;
}
else{
s[slow] = s[fast];
slow++;
while(fast<=right && s[fast]==' ')
fast++;
}
}
// 只留下前count个位置
s.resize(count);
// 反转整个字符串
len = s.size();
for(int i=0; i<len/2; i++)
swap(s[i],s[len-i-1]);
// 把每个单词分别反转
fast = 0; // fast定位到每一个单词的尾的后一个, 从0开始向后移动
while(fast<len){
slow = fast; // slow定位到每一个单词的头
while(fast<len && s[fast]!=' ') // fast定位到每一个单词的尾的后一个
fast++;
int range = fast-slow; // 单词的范围
for(int i=0; i<range/2; i++){ // 反转单词
swap(s[slow+i],s[fast-i-1]);
}
fast++; // fast向后移动一个, 移动到下一个单词的头
}
return s;
}
};

剑指 Offer 58 - II. 左旋转字符串

力扣传送门

1
// 还没做