文档讲解: 代码随想录
视频讲解:字符串基础操作! | LeetCode:344.反转字符串_哔哩哔哩_bilibili
第八天,开始练习字符串的部分了,练就完了!
344.反转字符串
感受:字符与数组实现或思考的逻辑比较相似,这可能也是卡哥没有在网上做过多介绍而是直接衔接练题的原因。题目本身很简单,但记住不要使用库函数reverse。
思路: 双指针法秒了。
class Solution {
public:
void reverseString(vector<char>& s) {
int length = s.size();
for(int i = 0, j = length - 1; i < length / 2; i++, j--){
swap(s[i], s[j]);
}
}
};
541.反转字符串II
感受:上题的plus版本,内容差不多,无非是多了一些要求。
思路:调用库函数的逻辑我们没有变,不过改用reverse函数了,值得一提的是reverse函数里只需要两个容器,具体表示为reverse(s.begin(), s.end()).其次就是为了满足题目要求,我们在遍历过程中是2k个、2k个这样遍历,同时加上判断语句,如果剩余字符小于等于2k个但大于k个,就反转前k个字符,小于k个则全部反转。
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);
continue;
}
reverse(s.begin() + i, s.end());
}
return s;
}
};
122.路径加密
感受:秒了
思路: 一开始我想的太复杂了,实际上就这么回事。直接遍历一遍字符串,遇到为“.”的直接赋值为“ ”就行了。
class Solution {
public:
string pathEncryption(string path) {
for(int i = 0; i < path.size(); i++){
if(path[i] == '.'){
path[i] = ' ';
}
}
return path;
}
};
151.反转字符串中的单词
感受:题目意思很好理解,但设计到很多字符串的操作,算是一道有综合性的题目。不看卡哥的视频本人大概率脑海里没有思路。
思路: 基本就分为三步:将整个字符串反转、去除多余空格、反转每个单词。
首先我们可以先写一个reverse函数方便我们后续进行字符串和单词的反转:
void reverse(string& s, int start, int end){
for(int i = start, j = end; i < j; i++, j--){
swap(s[i], s[j]);
}
}
其次进行去除空格操作,我们是利用双指针法。 在循环里我们判断如果遇到的字符为空格就删除所有空格,并手动为每个单词前添加一个空格(首单词除外,也就是再额外加入判断如果当前为首单词就不进行任何操作)。最后将字符串长度裁剪为我们新得到的值。
最后通过判断当目前循环到串尾或空格,我们调用函数将单词反转即可。
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 removeExtraSpace(string& s){
int slow = 0;
for(int i = 0; i < s.size(); i++){
//当前值为非空格,将所有空格删掉
if(s[i] != ' '){
if(slow != 0) s[slow++] = ' '; //这步是确定如果当前词不为首单词就需要添加空格
while(i < s.size() && s[i] != ' '){
s[slow++] = s[i++]; //填上该单词
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
removeExtraSpace(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;
}
};
总结:用时3h,剑指offer里的题也太难了,留着以后做,先保证把主要任务都消化完。