刷题笔记(5)---字符串

字符串

二级目录

三级目录

344. 反转字符串
class Solution {
public:
    void reverseString(vector<char>& s) {
        int l = 0, r = s.size() - 1;

        while(l < r)
        {
            swap(s[l], s[r]);
            l++;
            r--;
        }
        return;
    }
};
541. 反转字符串 II
class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.size();
        for(int i=0; i<n; i+=(2*k))
        {
            if(i+k <= n)
            {
                reverse(s.begin()+i, s.begin()+i+k);
                continue;
            }

            reverse(s.begin()+i, s.begin()+n);
        }
        return s;
    }
};
剑指 Offer 05. 替换空格
class Solution {
public:
    string replaceSpace(string s) {
        int count = 0;
        int sOldSize = s.size();
        for(int i=0; i<sOldSize; ++i)
        {
            if(s[i] == ' ') { count++; }
        }

        s.resize(sOldSize + count*2);
        int sNewSize = s.size();

        for(int i=sNewSize-1, j=sOldSize-1; j<i; --i, --j)
        {
            if(s[j] != ' ') { s[i] = s[j]; }
            else
            {
                s[i] = '0';
                s[i-1] = '2';
                s[i-2] = '%';
                i -= 2;
            }
        }

        return s;
    }
};
151. 翻转字符串里的单词
class Solution {
public:
    void reverse(string& s, int start, int end)
    {
        while(start < end)
        {
            swap(s[start], s[end]);
            start++;
            end--;
        }
    }

    void removeExtraSpaces(string& s)
    {
        int slowIdx = 0, fastIdx = 0;
        // 去掉字符串前面的空格
        while(s[fastIdx] == ' ' && fastIdx < s.size() && s.size() > 0) { fastIdx++; }

        // 去掉字符串中间部分的冗余空格
        for(; fastIdx<s.size(); ++fastIdx)
        {
            if(s[fastIdx] == ' ' && s[fastIdx] == s[fastIdx-1] && fastIdx-1 > 0) { continue; }
            else { s[slowIdx++] = s[fastIdx]; }
        }

        // 去掉字符串末尾的空格
        if(s[slowIdx-1] == ' ' && slowIdx-1 > 0) { s.resize(slowIdx - 1); }
        else { s.resize(slowIdx); }
    }

    string reverseWords(string s) {
        removeExtraSpaces(s); // 去掉冗余空格
        reverse(s, 0, s.size() - 1); // 将字符串全部反转
        for(int i = 0; i < s.size(); i++) {
            int j = i;
            // 查找单词间的空格,翻转单词
            while(j < s.size() && s[j] != ' ') j++;
            reverse(s, i, j - 1);
            i = j;
        }
        return s;
    }
};
剑指 Offer 58 - II. 左旋转字符串
class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(), s.begin()+n);
        reverse(s.begin()+n, s.end());
        reverse(s.begin(), s.end());
        return s;
    }
};

KMP(未仔细学习过)

28. 实现 strStr()
// An highlighted block
var foo = 'bar';
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值