代码随想录算法训练营day04之字符串

题目及链接:

344.反转字符串

541.反转字符串||

卡码网54.替换数字

151.翻转字符串里的单词

卡码网55.右旋字符串

28.找出字符串中第一个匹配项的下标

459.重复的子字符串

344.反转字符串

太简单就不写了

541.反转字符串||

题意:

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

做题状态:

怎么就没想到用min呢,while 和if弄了半天

题解:

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.length();
        for (int i = 0; i < n; i += 2 * k) {
            reverse(s.begin() + i, s.begin() + min(i + k, n));
        }
        return s;
    }
};

卡码网54.替换数字

有点简单了

#include<bits/stdc++.h>
using namespace std;
int main(){
    string st,str="";
    cin>>st;
    for(auto ch:st){
        if(isdigit(ch)){
            str+="number";
        }
        else str+=ch;
    }
    cout<<str;
    return 0;
}

151.翻转字符串里的单词

题意:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

输入:s = "  the sky is blue      "
输出:"blue is sky the"

做题状态:

感觉很简单但就是做不出来

题解:

来自小虎的优美简介代码(个人感觉比官方写的好):

class Solution {
public:
    string reverseWords(string s) {
        int i = s.size() - 1;
        string ans;
        while(i >= 0)
        {
            int c = 0;
            while(i >= 0 && s[i] == ' ') --i;
            while(i >= 0 && s[i] != ' ')
            {
                --i;
                ++c;
            }
            if(c)
                ans += s.substr(i+1, c) + " ";
        }

        return ans.substr(0, ans.size()-1);
    }
};

总结:

做题不要着急,不要一上来就开始写,先想一想易错点,代码的思路啥的

str.substr(pos,len);返回pos开始的len长的字符串

卡码网55.右旋字符串

题意:

输入整数k和字符串str,将str的后k个置于str的前面

输入示例
2
abcdefg
输出示例
fgabcde

做题状态:

用了两个substr,一分钟不到过了

题解:

1.substr

#include<bits/stdc++.h>
using namespace std;
int main(){
    int k;
    string str;
    cin>>k>>str;
    int n=str.length();
    string s=str.substr(n-k,k);
    s+=str.substr(0,n-k);
    cout<<s;
    return 0;
}

2.reverse

其实跟189.轮转数组几乎是一个题,唯一不同在于189题的K可能会比n大,所以要取模

整体反转再分别反转,积累一下这种思路

code(from 代码随想录)

#include<iostream>
#include<algorithm>
using namespace std;
int main() {
    int n;
    string s;
    cin >> n;
    cin >> s;
    int len = s.size(); //获取长度

    reverse(s.begin(), s.end()); // 整体反转
    reverse(s.begin(), s.begin() + n); // 先反转前一段,长度n
    reverse(s.begin() + n, s.end()); // 再反转后一段

    cout << s << endl;

}

28.找出字符串中第一个匹配项的下标

题意:

给两个字符串,找第二个在第一个里面出现的下标,没出现返回-1

做题状态:

不是,这题有点简单的过头咯,find一行秒

题解:

class Solution {
public:
    int strStr(string haystack, string needle) {
        return haystack.find(needle);
    }
};

459.重复的子字符串

题意:

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

做题状态:

用暴力做的,感觉做起来很别扭,看题解前没有找到简单的方法

题解:

(form随想录)

1.移动匹配

如果s满足条件,例如为abcabc,那么s+s=abcabcabcabc

那么中间必然出现s,所以删除首尾各一个字符后进行查找即可

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        string t = s + s;
        t.erase(t.begin()); t.erase(t.end() - 1); // 掐头去尾
        if (t.find(s) != std::string::npos) return true; // r
        return false;
    }
};

2.KMP算法

不会点这里看卡哥的视频

KMP理论求next数组

class Solution {
public:
    void getNext (int* next, const string& s){
        next[0] = -1;
        int j = -1;
        for(int i = 1;i < s.size(); i++){
            while(j >= 0 && s[i] != s[j + 1]) {
                j = next[j];
            }
            if(s[i] == s[j + 1]) {
                j++;
            }
            next[i] = j;
        }
    }
    bool repeatedSubstringPattern (string s) {
        if (s.size() == 0) {
            return false;
        }
        int next[s.size()];
        getNext(next, s);
        int len = s.size();
        if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0) {
            return true;
        }
        return false;
    }
};

总结反思:

几乎都做过,所以今天还挺轻松的,就复习了一下半个月前学的kmp算法,当时·就学了个理论,现在用在题目上了(๑•̀ㅂ•́)و✧

  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

失序空间

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值