字符串常用操作
头文件: # include < string >
1、构造函数
string str, str1;
string str2("abcde");//定义新容器, 将 “abcde” 作为初值
string str3 = "abcde";//同上
string str4{ "abcde" };//同上
string str5 = { "abcde" };//同上
string str6{ 'a','b','c','d','e' };//同上
string str7(6, 's');//定义新容器, 将 6 个 ‘s’ 作为初值
string str8(str);//定义新容器 str8, 拷贝 str 所有的元素
string str9 = str;//同上
string str10(str, 2);//定义新容器 str10, 拷贝 str[2]~str[n-1]
string str11(str, 2, 3);// 定义新容器 str11, 拷贝 str[2]~str[2+3-1]
string str12(str.begin(), str.end());//定义新容器 str2, 拷贝区间内元素
2、功能
(1)随机访问容器内字符
支持下标 [] 和 at 函数随机访问容器内字符 str[id]:返回下标为 id 的字符, 不检查是否越界 str.at(id):返回下标为 id 的字符, 如果越界抛出异常
(2)assign (赋值函数)
str.assign(6, 's');//将 6 个 ‘s’ 赋值给 str
str.assign(str1);//将 str1 赋值给 str
str.assign(str1, 2);//将 str1[2]~str1[n-1] 赋值给 str
str.assign(str1, 2, 3);//将 str1[2]~str1[2+3-1] 赋值给 str
str.assign(str1.begin(), str1.end());//将区间内的元素赋值给 str
(3)连接符
+和 +=:连接字符串 =:字符串赋值 >、>=、< 和 <=:字符串比较 (例如a < b) ==、!=:比较字符串 <<、>>:输出、输入字符串 例: str += str1;// 在 str 末尾添加 str1
(4)常用函数
str.push_back('s');//在末尾添加字符 ‘s’
str.pop_back();//删除最后一个元素
str.front();//返回第一元素
str.back();//返回最末元素
str.clear();//清空容器
str.empty();//容器为空返回true, 否则返回 false
(5)长度/空间/容量相关函数
str.length();//返回字符串 str 的长度
str.size();//返回容器内目前的元素个数
str.max_size();//返回元素个数 size 的最大值
str.resize(3);//设置 size,只影响 size,设置之后 size=3,若尺寸变小, 多余部分截掉
str.resize(3, 's');//设置 size, 如果尺寸变大,新空间全部用 ‘s’ 代替
str.capacity();//返回重新分配内存前 str 可以容纳的字符数,至少比size大。大小只能为:16*n-1
str.reserve(3);//设置 str 的 capacity,以保留 3 个字符空间,只影响 capacity。设置之后,capacity>=3
(6)添加元素
insert(插入函数)
str.insert(2, 3, 's');//在位置之前插入 3 个字符 ‘s’
str.insert(2, "string");//在位置之前插入字符串 “string”, 返回str
str.insert(2, str1);//在位置之前插入 str1 字符串
str.insert(2, str1, 3);//在位置之前插入 str1[3]~str1[n-1]
str.insert(2, str1, 3, 4);//在位置之前插入 str1[3]~str1[3+4-1]
str.insert(str.end(), 's');//在位置之前插入字符 ‘s’, 返回新元素的第一个位置
str.insert(str.end(), 3, 's');//在位置之前插入 3 个字符 ‘s’
str.insert(str.end(), str1.begin(), str1.end());//在位置之前插入 str1 区间内的元素.
append(连接函数)
str.append(6, 's');//在 str 末尾添加 6 个字符 ‘s’
str.append(str1);// 在 str 末尾添加 str1
str.append(str1, 2);//在 str 末尾添加 str1[2]~str1[n-1]
str.append(str1, 2, 3);//在 str 末尾添加 str1[2]~str1[2+3-1]
str.append(str1.begin(),str1.end());//将 str1 区间内的元素添加到 str 末尾
(7)erase 删除元素
str.erase(3);//删除 str[3]~str[n-1], 返回str
str.erase(2, 3);//删除 str[2]~str[2+3-1]
str.erase(str.begin());//删除指向的元素, 返回迭代器, 指向下一元素
str.erase(str.begin(), str.end());//删除区间内的元素, 返回迭代器, 指向下一元素
(8)更改数据
replace替换函数
str.replace(2,3,4,'s');//将 str[2]~str[2+3-1] 替换成 4 个 ‘s’
str.replace(2,3,ch);//将 str[2]~str[2+3-1] 替换成 ch
str.replace(2,3,ch,4);//将 str[2]~str[2+3-1] 替换成 ch的前 4 个字符
str.replace(2,3,ch,4,5);//将 str[2]~str[2+3-1] 替换成 ch[4]~ch[4+5-1]
str.replace(2,3,str1);//将 str[2]~str[2+3-1] 替换成 str1
str.replace(2,3,str1,4);//将 str[2]~str[2+3-1] 替换成 str1[4]~str1[n-1]
str.replace(2,3,str1,4,5);//将 str[2]~str[2+3-1] 替换成 str1[4]~str1[4+5-1]
str.replace(str.begin(),str.end(),3,'s');//将区间内的元素替换成 3 个 ‘s’
str.replace(str.begin(),str.end(),ch);//将区间内的元素替换成 ch
str.replace(str.begin(),str.end(),ch,3);//将区间内的元素替换成 ch 的前 3 个字符
str.replace(str.begin(),str.end(),str1);//将区间内的元素替换成 str1
copy复制函数
// 更改的是 ch 数组
str.copy(ch, 3);//将 ch 前 3 个字符替换成 str 的前 3 个字符
str.copy(ch, 3, 2);//将 ch 前 3 个字符替换成 str[2]~str[2+3-1]
大小写转换
transform(str.begin(), str.end(), str1.begin(), ::toupper);
//将 str 的英文全部转换为大写, 赋值给 str1, str1.size() 必须大于等于 str.size()
transform(str.begin(), str.end(), str1.begin(), ::tolower);
//将 str 的英文全部转换为小写, 赋值给 str1
(9)查找数据
find系列(查找函数)
能找到返回下标,否则返回str.npos(int:-1) 包括: find / rfind find_first_of / find_first_not_of find_last_of / find_last_not_of
str.find('s');//返回字符 ‘s’ 在 str 中首次出现的位置
str.find('s', 2);//返回字符 ‘s’ 在 str[2]~str[n-1] 中首次出现的位置
str.find(ch);//返回字符串 ch 在 str 中首次出现的位置
str.find(ch, 4);//返回 ch 在 str[4]~str[n-1] 中首次出现的位置
str.find(ch, 4, 3);//返回 ch[0]~ch[3-1] 在 str[4]~str[n-1] 中首次出现的位置
str.find(str1);//返回 str1 在 str 中首次出现的位置
str.find(str1, 2);//返回 str1 在 str[2]~str[n-1] 中首次出现的位置
str.rfind(str1);//反向查找 str1 在 str 中首次出现的位置
str.rfind(str1,2);//反向查找 str1 在 str[0]~str[2+str1.size()-1] 中首次出现的位置
str.find_first_of(str1);//返回 str1 中任意一个字符在 str 中首次出现的位置
str.find_first_not_of(str1);//返回除 str1 以外的任意一个字符在 str 中首次出现的位置
str.find_last_of(str1);//返回 str1 中任意一个字符在 str 中最后一次出现的位置
str.find_last_not_of(str1);//返回除 str1 以外的任意一个字符在 str 最后一次出现的位置
substr(字串查找)
str.substr(2);//返回 str[2]~str[n-1], 不对 str 进行操作
str.substr(2,3);//返回 str[2]~str[2+3-1]
344.反转字符串
题目链接:344.反转字符串
讲解视频:字符串基础操作! | LeetCode:344.反转字符串
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e","h"]
解题思路:
定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素
代码:
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i = 0, j = s.size()-1; i<=j; i++,j--)
swap(s[i],s[j]);
return ;
}
};
541. 反转字符串II
题目链接:541. 反转字符串II
讲解视频:字符串操作进阶! | LeetCode:541. 反转字符串II
题目描述:
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2 输出:"bacd"
解题思路:
使用c++库中自带的反转字符串函数reverse()。每2*k范围作为区间进行操作,注意题目中两个“特殊”情况。
代码:
class Solution {
public:
string reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i+=2*k)
if(s.size()-i < k) reverse(s.begin()+i,s.end());
else reverse(s.begin()+i,s.begin()+i+k);
return s;
}
};
卡码网:54.替换数字
题目链接:卡码网:54.替换数字
题目描述:
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
解题思路:
第一种是创建一个新的数组保存最新结果;
第二种是原地操作--采用双指针法:
- 将当前字符串s进行原地扩容(resize方法),扩容标准是当前字符串中数字个数乘以6(number字符个数)减去数字个数。这样就能保证最后直接返回字符串s即可,而不需求其子串。(下图中有1个数字,因此再扩容1*6-1=5个sizeof char大小的空间)
- 两个指针均从后往前遍历。idx1指针遍历原始字符串,idx2指针用来填充新串值。从后往前保证字母字符元素在完成填充前不会被覆盖。
![](https://i-blog.csdnimg.cn/direct/2e1816b9c1a34c618163d155db791be0.png)
代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string s;
cin >> s;
int cnt = 0;
for(auto c : s)
if(c >= '0' && c <= '9') cnt++;
int idx1 = s.size() - 1;
s.resize(s.size()+cnt*5);
int idx2 = s.size() - 1;
char c[6] = {'n','u','m','b','e','r'};
for(int i = idx1; i >= 0; i--)
{
if(s[i] >= 'a' && s[i] <= 'z') s[idx2--] = s[i];
else
{
for(int j = 5; j >= 0; j--) s[idx2--] = c[j];
}
}
cout << s << endl;
return 0;
}