DAY9 - 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459. 重复的子字符串

151.翻转字符串里的单词

把复杂问题拆分成简单问题的能力比较薄弱。比如这个问题中:

删除空格 =》删除字符串中的元素并且添加

调转单词=》先把整串字符串倒转,再分别倒转正每个单词

class Solution {
public:
    string reverseWords(string s) {
        // 移除空格 跟移除元素操作一样
        int slow=0;
        for(int fast=0;fast<s.size();fast++){
            if(s[fast]!=' '){
                if(slow!=0) s[slow++]=' ';  //增加空格
                while(fast<s.size()&&s[fast]!=' '){  //单词直接copy
                    s[slow++]=s[fast++];
                }
            }
        }
        s.resize(slow);

        //反转整个字符串
        for(int i=0,j=s.size()-1;i<j;i++,j--){
            swap(s[i],s[j]);
        }

        //把单词转正
        int i=0,j=0;
        while(i<s.size()&&j<s.size()){
            while(j<s.size()&&s[j]!=' ') {j++;}
            for(int m=i,n=j-1;m<n;m++,n--){
                swap(s[m],s[n]);
            }
            i=j+1;
            j=i;
        }

        return s;

    }
};

删除空格这里有点没有看懂,晕晕的。

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

字符串转来转去就都是反转字符串的延申。

这个的思路就是先整个字符串反转,再分别反转前后两个子串。

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

int main(){
    string s;
    int k;
    cin >> k;
     cin >> s;
    for(int i=0,j=s.size()-1;i<j;i++,j--){
        swap(s[i],s[j]);
    }
    for(int i=0,j=k-1;i<j;i++,j--){
        swap(s[i],s[j]);
    }
    for(int i=k,j=s.size()-1;i<j;i++,j--){
        swap(s[i],s[j]);
    }
    cout << s;
}
posted @ 2025-03-25 13:22  ChloeChen0221  阅读(12)  评论(0)    收藏  举报