代码随想录算法训练营第九天 | 151.翻转字符串里的单词 卡码网:55.右旋转字符串 28. 实现 strStr() 459.重复的子字符串

151.翻转字符串里的单词

有点类似昨日的最后一题,都涉及到一些逻辑处理。这题跳过空格,也可以用指针和substr提取字符串做处理。我这里使用istringstream提取字符串,再创建额外的空间写出翻转后的结果(感觉这样会简单很多。

class Solution {
public:
    string reverseWords(string s) {
        vector<string> vec;
        std::istringstream iss(s);
        std::string word;

        while (iss >> word) {
            vec.push_back(word);
        }     
        string res;  
        for(int i = vec.size() - 1; i > 0;--i) {
            res+=vec[i] + " ";   
        }   
        res+=vec[0];

        return res;
                
    }
};

不创建另外的空间,这里采用反转字符串再反转字符,配合空格的逻辑处理也能解决。

class Solution {
public:
    string reverseWords(string s) {
        //去除开头和结尾的空格
        auto start = s.find_first_not_of(" ");
        auto end = s.find_last_not_of(" ");
        s = s.substr(start, end - start + 1); // 截取去掉开头和结尾空格的子字符串
        //翻转整符串
        std::reverse(s.begin(), s.end());
        //翻转单词
        int wordStart = 0;
        for (int wordEnd = 0; wordEnd < s.size(); ++wordEnd) {
            if (s[wordEnd] == ' ') {
                std::reverse(s.begin() + wordStart, s.begin() + wordEnd); // 翻转单词
                wordStart = wordEnd + 1; 
            }
        }
        // 翻转最后一个单词
        std::reverse(s.begin() + wordStart, s.end());
        //去除重复的空格
        auto it = std::unique(s.begin(), s.end(), [](char a, char b) {
            return a == ' ' && b == ' ';
        });
        s.erase(it, s.end());
        return s;         
    }
};

卡码网:55.右旋转字符串

思路简单,找到pos位置后,很容易想到分成两个字符串再拼接;也可以从原地后往前插入字符。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main(){
    int num;
    string str;
    cin >> num >> str;
    int n = str.size();
    int pos = n - num;
    auto str2 = str.substr(pos);
    auto str1 = str.substr(0,pos);
    cout << str2 + str1 << endl;
    return 0;
}

28. 实现 strStr()

要用到KMP算法,先插个眼 KMP 算法讲解,下次再补齐代码。 

459.重复的子字符串

同上。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值