字符串篇章--代码随想录算法训练营第八天| 344.反转字符串,541. 反转字符串II ,卡码网:54.替换数字

字符串常用操作

头文件: # 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"。

解题思路:

第一种是创建一个新的数组保存最新结果;

第二种是原地操作--采用双指针法:

  1. 将当前字符串s进行原地扩容(resize方法),扩容标准是当前字符串中数字个数乘以6(number字符个数)减去数字个数。这样就能保证最后直接返回字符串s即可,而不需求其子串。(下图中有1个数字,因此再扩容1*6-1=5个sizeof char大小的空间)
  2. 两个指针均从后往前遍历。idx1指针遍历原始字符串,idx2指针用来填充新串值。从后往前保证字母字符元素在完成填充前不会被覆盖。


代码:

#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;
}

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值