代码随想录:字符串

344.反转字符串

力扣题目链接

思考:

不额外申请空间,用双指针交换,双指针就是记录数组下标。交换元素可以直接用swap(s[st],s[ed])

代码:

    void reverseString(vector<char>& s) {
        if(s.empty()) return;
        int st = 0;
        int ed = s.size() -1;
        while(st < ed)
        {
            swap(s[st],s[ed]);
            st++;
            ed--;
        }
    }

541. 反转字符串II

力扣题目链接

代码:

class Solution {
public:
    void MySwap(string& s, int left, int right)
    {
        if(s.empty()) return;
        if(left < 0 || right + 1 > s.size()) return;

        int i = left;
        int j = right;
        while(i<j)
        {
            swap(s[i],s[j]);
            i++;
            j--;
        }
    }

    string reverseStr(string s, int k) {
        if(s.size() < 2) return s;

        int left = 0;
        int right = 2*k - 1;
        while(right < s.size()) 
        {
            MySwap(s,left,left + k - 1);
            left = right + 1;
            right += 2*k;
        }
        
        if(left < s.size()) 
        {
            int leave_length = s.size() - left;
            if(leave_length < k)  MySwap(s,left,s.size() - 1);
            else if(leave_length < 2 * k)  MySwap(s,left,left + k - 1);
            else;
        }

        return s;
    }
};

替换数字

卡码网题目链接

例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。

#include <iostream>
using namespace std;
int main() {
    string s;
    while (cin >> s) {
        int sOldIndex = s.size() - 1;
        int count = 0; // 统计数字的个数
        for (int i = 0; i < s.size(); i++) {
            if (s[i] >= '0' && s[i] <= '9') {
                count++;
            }
        }
        // 扩充字符串s的大小,也就是将每个数字替换成"number"之后的大小
        s.resize(s.size() + count * 5);
        int sNewIndex = s.size() - 1;
        // 从后往前将数字替换为"number"
        while (sOldIndex >= 0) {
            if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {
                s[sNewIndex--] = 'r';
                s[sNewIndex--] = 'e';
                s[sNewIndex--] = 'b';
                s[sNewIndex--] = 'm';
                s[sNewIndex--] = 'u';
                s[sNewIndex--] = 'n';
            } else {
                s[sNewIndex--] = s[sOldIndex];
            }
            sOldIndex--;
        }
        cout << s << endl;       
    }
}

151.翻转字符串里的单词

力扣题目链接

class Solution {
public:
    // 翻转字符串下标left到right子串
    void MyReverse(string& s, int left, int right)
    { 
        if(s.empty() || left <0; right > s.size() - 1) return;
        for(int i = left, j = right; i < j; i++, j--)
        {
            char tmp = s[i];
            s[i] = s[j];
            s[j] = tmp;
        }
    }

    void DeleteEmpty(string& s)
    { 
        if(s.empty()) return;
        int fast = 0, slow = 0;
        while(fast < s.size() &&s[fast] == ' ') fast++; // 去掉开头的空格

        // 去除中间的空格
        for(;fast < s.size();fast++)
        {
             if (fast - 1 >=0 && s[fast - 1] == s[fast]&&s[fast] == ' ') continue;
             s[slow] = s[fast];
             slow++;
        }

        // 去除末尾空格加上重置s的大小
        // 注意退出循环时slow++
        if(slow - 1 >= 0 && s[slow - 1] == ' ') s.resize(slow - 1);
        else s.resize(slow);
    }

    // 思路:
    // 1. 去除多余的空格,包括头尾和中间
    // 2. 翻转整个字符串
    // 3. 翻转单个单词
    string reverseWords(string s) {
        MyReverse(s, 0, s.size() - 1); // 翻转全部字符串
        DeleteEmpty(s); // 去空格
        int left = 0;

        // i可以取到s.size,交换的是left 和 i - 1
        for(int i = 0; i <= s.size(); ++i) 
        {
            // 遇到空格或者队尾
            if(i == s.size() || s[i] == ' ')
            {
             MyReverse(s, left, i - 1); // 翻转空格隔开的字符串
             left = i + 1;
            }
        }

        return s;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值