【算法】代码随想录之字符串(更新中)

文章目录

前言

一、反转字符串(LeetCode--344)

二、反转字符串II(LeetCode--541)

三、反转字符串中的单词(LeetCode--151)


前言

跟随代码随想录,学习字符串相关的算法题目,记录学习过程中的tips。


一、反转字符串(LeetCode--344)

【1】题目描述:

【2】解决思想:首尾指针法,交换首尾指针对应的元素,直到首尾指针相遇。

【3】C++代码:

class Solution {
public:
    void reverseString(vector<char>& s) {
        int low = 0, end = s.size() - 1;
        while (low < end) {
            char tmp = s[low];
            s[low] = s[end];
            s[end] = tmp;
            low++;
            end--;
        }
    }
};

【4】时间复杂度:O(N)

【5】空间复杂度:O(1)


二、反转字符串II(LeetCode--541)

【1】题目描述:

【2】解决思想:每次让i走2k步,立足当下的i,反转属于[i,i+k)范围内的元素,若到末尾不够k则反转全部。

【3】C++代码:

class Solution {
private:
    void reverse(string &s, int low, int high) {
        high--;
        while (low < high) {
            char tmp = s[low];
            s[low] = s[high];
            s[high] = tmp;
            low++;
            high--;
        }
    }
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += 2*k) {//每次走2k
            if (i+k <= s.size()) {//反转前k个
                reverse(s, i, i+k);
            } else {//末尾反转剩余
                reverse(s, i, s.size());
            }
        }
        return s;
    }
};

【4】时间复杂度:O(N)

【5】空间复杂度:O(1)


三、反转字符串中的单词(LeetCode--151)

【1】题目描述:

【2】解决思想:首先,双指针法移除字符串中多余字符(舍弃开头和结尾,中间保留一个)。其次,反转整个字符串。最后,反转单独字符串中的单词。

【3】C++代码:

class Solution {
private:
    void reverse(string& s, int low, int high) {
        high--;
        while (low < high) {
            char tmp = s[low];
            s[low] = s[high];
            s[high] = tmp;
            low++;
            high--;
        }
    }
public:
    string reverseWords(string s) {
        //双指针移除多余空格
        int low = 0;
        for (int high = 0; high < s.size(); high++) {
            if (s[high] != ' ') {
                if (low != 0) {//单词间保留一个空格
                    s[low++] = ' ';
                }
                while (high < s.size() && s[high] != ' ') {//保留整个单词
                    s[low++] = s[high++];
                }
            }
        }
        s.resize(low);
        //整体反转(左闭右开)
        reverse(s, 0, s.size());
        //每个单词反转
        int start = 0;
        for (int i = 0; i <= s.size(); ++i) {
            if (s[i] == ' ' || i == s.size()) {
                reverse(s, start, i);
                start = i + 1;
            }
        }
        return s;
    }
};

【4】时间复杂度:O(N)

【5】空间复杂度:O(1)


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值