代码随想录算法训练营第九天|151. 反转字符串中的单词|右旋字符串

151.翻转字符串里的单词

思路:

1、先去空格

2、反转整个字符串

3、反转每个单词

困难:

1、去空格时怎么去除前导后导的空格 字母前的空格才算?使用flag?

移除所有空格并手动添加一个空格? 添加空格后直接循环到下一个空格 然后看下一个非空格

2、在反转每个单词的时候怎么精准使用reverse?快慢指针?

3、debug错误

最后反转单词的时候,==使用了=而且忽略了最后一个单词

去空格的时候if (j != 0)把后面循环也包含进去了

代码:

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

右旋字符串

#include<string>
#include<algorithm>
#include<iostream>
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);
    reverse(s.begin()+n,s.end()); 
    cout << s << endl;
    return 0;
}

28. 实现 strStr() 

暴力算法

1、i <= haystack.size() - needle.size(); 这里是小于等于

2、 if(haystack.size()<needle.size()) return -1; 开局先判断大小

代码:

class Solution {
public:
    int strStr(string haystack, string needle) {
        if(haystack.size()<needle.size()) return -1;
        for(int i = 0; i <= haystack.size() - needle.size(); i++) { // 修改部分:条件从 i < haystack.size() - needle.size() 变为 i <= haystack.size() - needle.size()
            int j = 0;
            while(j < needle.size() && haystack[i + j] == needle[j]) { // 修改部分:将 || 改为 &&
                j++;
            }
            if(j == needle.size()) return i;
        }
        return -1;
    }
};

kmp算法

class Solution {
public:
    void getNext(int *next,const string& s) {
        int j = 0;
        next[0] = 0;
        for(int i=1;i<s.size();i++) {
            while(j>0&&s[i]!=s[j]) {
                j=next[j-1];
            }
            if(s[i]==s[j]) {
                j++;
            }
            next[i]=j;
        }
    }
    int strStr(string haystack, string needle) {
        if(needle.size()==0) return 0;
        if(needle.size()>haystack.size()) return -1;
        vector<int> next(needle.size());
        getNext(&next[0],needle);
        int j=0;
        for(int i=0;i<haystack.size();i++) {
            while(j>0&&haystack[i]!=needle[j]){
                j = next[j-1];
            }
            if(haystack[i] == needle[j]) {
                j++;
            }
            if(j == needle.size()) {
                return(i-needle.size()+1);
            }
        }
    return -1;
    }

};

459.重复的子字符串

枚举法

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int n=s.size();
        for(int i=1;i<=n/2;i++) {
            if(n%i==0) {
                bool match = true;
                for(int j=i;j<n;j++){
                    if(s[j]!=s[j-i]) {
                        match=false;
                        break;
                    }
                }
                if(match) return i;
            }
        }
        return false;
    }
};

  • 3
    点赞
  • 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、付费专栏及课程。

余额充值