相关链接
视频讲解:字符串基础操作! | LeetCode:344.反转字符串_哔哩哔哩_bilibili
视频讲解:字符串操作进阶! | LeetCode:541. 反转字符串II_哔哩哔哩_bilibili
视频讲解:字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili
左旋转字符串_牛客题霸_牛客网 (nowcoder.com)
反转字符串
解题思路
双指针解法,起初一个指针指向首元素,一个指针指向末尾元素,两两交换,指针向中间移动,本体最重要的是注意循环条件的终止。
AC代码
class Solution {
public:
void reverseString(vector<char>& s) {
int len=s.size();
for(int i=0,j=len-1;i<len/2;i++,j--)
{
swap(s[i],s[j]);
}
}
};
反转字符串II
解题思路
字符穿反转的局部调用,遍历字符串,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。如果剩余字符少于 k
个,则将剩余字符全部反转。在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
遇到的困难&&总结
string中的迭代器不是很了解,补充相关知识。
begin():指向容器第一个元素的位置(可读可写)
end():指向容器最后一个元素的下一个位置(可读可写)
AC代码
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=(2*k))
{
if(i+k<=s.size())
{
reverse(s.begin()+i,s.begin()+i+k);
}
else
{
reverse(s.begin()+i,s.end());
}
}
return s;
}
};
路径加密
AC代码
class Solution {
public:
string pathEncryption(string path) {
for(int i=0;i<path.size();i++)
{
if(path[i]=='.')
path[i]=' ';
}
return path;
}
};
反转字符串中的单词
解题思路
首先移除多余的空格,利用双指针解法,其次对字符串进行整体反转,再对单词进行逐个反转。
遇到的困难&&总结
1)reverse函数定义的左闭右闭
2)双指针解法移除多余空格
3)如何反转
AC代码
class Solution {
public:
void reverse(string&s,int start,int end)
{
for(int i=start,j=end;i<j;i++,j--)
{
swap(s[i],s[j]);
}
}
void removeblank(string&s)
{
int slow=0;
for(int fast=0;fast<s.size();fast++)
{
if(s[fast]!=' ')
{
if(slow!=0)
{
s[slow++]=' ';
}
while(fast<s.size()&&s[fast]!=' ')
{
s[slow++]=s[fast++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
removeblank(s);
reverse(s,0,s.size()-1);
int start=0;
for(int i=0;i<=s.size();i++)
{
if(i==s.size()||s[i]==' ')
{
reverse(s,start,i-1);
start=i+1;
}
}
return s;
}
};
替换空格
解题思路
双指针解法,i指向新长度的末尾,j指向旧长度的末尾。
其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
这么做有两个好处:
- 不用申请新数组。
- 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
AC代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串
*/
string replaceSpace(string s) {
int s_old=s.size();
int count=0;
for(int i=0;i<s.size();i++)
{
if(s[i]==' ')
count++;
}
s.resize(s_old+count*2);
int s_new=s.size();
for(int j=s_new-1,i=s_old-1;i<j;i--,j--)
{
if(s[i]!=' ')
{
s[j]=s[i];
}
else {
s[j]='0';
s[j-1]='2';
s[j-2]='%';
j=j-2;
}
}
return s;
}
};
左旋转字符串
AC代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @param n int整型
* @return string字符串
*/
string LeftRotateString(string str, int n) {
if(str.size()<=0)
return "";
n=n%str.size();
reverse(str.begin(), str.begin() + n);
reverse(str.begin() + n, str.end());
reverse(str.begin(), str.end());
return str;
}
};
总结
需要深刻理解反转函数的本质并且灵活运用。