代码随想录算法训练day8 | 字符串

目录

344、541. 反转字符串

替换空格

151. 反转字符串中的单词

方法一:利用字符串的合并

方法二:双指针

左旋转字符串

方法一:申请额外空间

方法二:整体翻转,然后内部分块翻转


344、541. 反转字符串

简单模拟,没有难点

有时候双指针的想法真的能够减少很多代码量。

// 344
class Solution {
public:
    void reverseString(vector<char>& s) {
        for(int i=0; i<(s.size()/2); i++){
            swap(s[i], s[s.size()-1-i]);
        }
    }
};


// 541
class Solution {
public:
    void reverselr(string &s, int l, int r){
        while(l<r){
            swap(s[l], s[r]);
            l++;
            r--;
        }
    }
    string reverseStr(string s, int k) {
        int i = 0;
        int n = s.size();
        for (i = 0; i < n; i = i+2*k){
            if ( n-i >=k)
                reverselr(s, i, i+k-1);
            else
                reverselr(s, i, n-1);
        }
        return s;
    }
};

替换空格

技巧:不要使用额外空间,首先利用resize()函数将空间扩大到最终空间,然后从右往左移动指针,知道原指针和新指针相遇即可。

注意:从后向前的原因是,只用原string即可,不用担心数据覆盖的问题。

方法很巧妙,将双指针的方法做到了极致。

class Solution {
public:
    string replaceSpace(string s) {
        int n = s.size();
        int m = n;
        for (char a:s){
            if (a==' ')
                n += 2;
        }
        s.resize(n);
        int l = m-1;
        int r = n-1;
        while(l<r){
            if (s[l] == ' '){
                s[r] = '0';
                s[r-1] = '2';
                s[r-2] = '%';
                l--;
                r = r-3;
            }
            else{
                s[r] = s[l];
                r--;
                l--;
            }
        }
        return s;
    }
};

151. 反转字符串中的单词

方法一:利用字符串的合并

class Solution {
public:
    string reverseWords(string s) {
        string ans = "";
        for (int i=0; i<s.size(); i++){
            if (s[i]==' ')
                continue;
            string temp = ""; //记得要初始化
            while(i<s.size() && s[i]!=' '){
                temp += s[i];
                i++;
            }
            if (ans!="")
                temp = temp + " ";
            ans = temp + ans;
        }
        return ans;
    }
};

方法二:双指针

思路:利用双指针去重后,先将整体字符串反转,然后将内部各个单词反转

保证了空间复杂度是O(1)的.

class Solution {
public:
    string reverseWords(string s) {
        int i=0, j=0;
        int n = s.size();
        for (j=0; j<n; j++){
            if (s[j]==' ')
                continue;
            if (i!=0)
                s[i++] = ' ';
            while(j<n && s[j] != ' '){
                s[i] = s[j];
                i++;
                j++;
            }
        }
        s.resize(i);
        int start = 0;
        reverse(s.begin(), s.end());
        for (j=0; j<i; j++){
            if (s[j]==' '){
                reverse(s.begin()+start,s.begin()+j);
                start = j+1;
            }
        }
        reverse(s.begin()+start, s.end());
        return s;
    }
};

左旋转字符串

方法一:申请额外空间

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        int l = s.size();
        int t = n % l;
        string ans="";
        int i=t;
        for (; i<l; i++){
            ans += s[i];
        }
        for (int k=0; k<t; k++){
            ans += s[k];
        }
        return ans;
    }
};

方法二:整体翻转,然后内部分块翻转

注意:reverse()函数翻转的范围是左闭右开的

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        int l = s.size();
        int t = n % l;
        if (t==0)
            return s;
        reverse(s.begin(), s.end());
        reverse(s.begin(), s.end()-t);
        reverse(s.end()-t, s.end());
        return s;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值