344.反转字符串
初见想法:双指针
class Solution {
public:
void reverseString(vector<char>& s) {
int i = 0, j = s.size()-1;
while (j > i)
{
swap(s[i++], s[j--]);
}
}
};
一定要主要 i++ 和 j-- ,不要把i 也写成i--
541. 反转字符串II
class Solution {
public:
string reverseStr(string s, int k) {
int m = s.size();
for (int i = 0; i < m; i += 2*k)
{
reverse(s.begin()+i, s.begin() + min(i+k, m));
}
return s;
}
};
初见想法很复杂,没想到可以直接使用reverse函数,也没想到可以这样用for函数
剑指offer 05.替换空格
class Solution {
public:
string replaceSpace(string s) {
int oldsize = s.size();
int count = 0;
for (int i = 0; i < oldsize; i++)
{
if (s[i] == ' ')
{
count++;
}
}
s.resize(oldsize + 2*count);
int i = oldsize, j = s.size();
while (j > i)
{
if (s[i] == ' ')
{
s[j--] = '0';
s[j--] = '2';
s[j--] = '%';
i--;
}
else
{
s[j--] = s[i--];
}
}
return s;
}
};
首先记录原string的大小和空格的数量,然后再对原string扩容
倒序遍历string, 当遇到空格时,倒序插入%20 直到两个指针相遇,代表着接下来不会再有空格了
151.翻转字符串里的单词
class Solution {
public:
// 首先移除所有多余空格
// 翻转整个string
// 遍历整个字符串,翻转当个单词
string reverseWords(string s) {
removeExtraSpace(s);
reverse(s, 0, s.size()-1);
int start = 0;
for (int i = 0; i <= s.size(); i++)
{
if (s[i] == ' ' || i == s.size())
{
reverse(s, start, i-1);
start = i+1;
}
}
return s;
}
void reverse(string &s, int start, int end)
{
while (start < end)
{
swap(s[start++], s[end--]);
}
}
void removeExtraSpace(string &s)
{
int slow = 0;
for (int i = 0; i < s.size(); i++)
{
// 遍历到一个新的单词
if (s[i] != ' ')
{
// slow不为0,那么就不是第一个单词,前面加上' '
if (slow != 0) s[slow++] = ' ';
// 复制整个单词
while (i < s.size() && s[i] != ' ')
{
s[slow++] = s[i++];
}
}
}
// 假设slow的大小为n, string下标最多到n-1
s.resize(slow);
}
};
整个思路异常复杂,但是可以一步一步的解决,以后再写题的时候可以一步一步先把思路记下来
利用快慢指针把多余的空格去掉
剑指offer 58-II 左旋字符串
class Solution {
public:
string reverseLeftWords(string s, int n) {
int m = s.size()-1;
reverse(s, 0, m);
reverse(s, m-n+1, m);
reverse(s, 0, m-n);
return s;
}
void reverse(string &s, int start, int end)
{
while (start < end)
{
swap(s[start++], s[end--]);
}
}
};
先翻转整个string, 局部两个部分分别翻转