Day 8 字符串
344. 反转字符串
很经典的双指针算法
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0, right = s.size() - 1;
while (left < right)
{
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
};
541. 反转字符串II
虽然一次通过了,但是感觉写的很不优雅
class Solution {
void reverseSubStr(string &s, int left, int right)
{
--right;
while (left < right)
{
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
public:
string reverseStr(string s, int k) {
int left = 0, right = k, step = 2 * k, len = s.size();
while (left < len && right <= len)
{
reverseSubStr(s, left, right);
left += step;
right += step;
}
if (left < len)
{
reverseSubStr(s, left, len);
}
return s;
}
};
更加优雅的写法
class Solution {
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += 2 * k)
{
if (i + k < s.size())
{
reverse(s.begin() + i, s.begin() + i + k);
}
else
{
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
剑指Offer 05. 替换空格
class Solution {
public:
string replaceSpace(string s) {
string ret;
ret.reserve(s.size() * 3);
for (auto c : s)
{
if (c == ' ')
{
ret.push_back('%');
ret.push_back('2');
ret.push_back('0');
}
else
{
ret.push_back(c);
}
}
ret.shrink_to_fit();
return ret;
}
};
151.反转字符串中的单词
没审清题意,写了一个没有合并空白字符的版本,勉强把它记下来
class Solution {
void reverseSubStr(string &s, int start, int end)
{
--end;
while (start < end)
{
char tmp = s[start];
s[start] = s[end];
s[end] = tmp;
start++;
end--;
}
}
public:
string reverseWords(string s) {
int start = 0, end = 0;
while (end < s.size())
{
if (s[end] == ' ')
{
reverseSubStr(s, start, end);
while (s[end] == ' ') end++;
start = end;
}
else
{
end++;
}
}
reverseSubStr(s, start, end);
reverse(s.begin(), s.end());
return s;
}
};
三个步骤:
- 清除多余的空格
- 反转每一个单词
- 反转整个字符串
步骤很重要,如果想把前两步混在一起做,会变得非常麻烦。
清除多余的空格
void removeWhiteSpace(string &s)
{
// 清除多余的空格
int left = 0, right = 0;
while (s[right] == ' ') right++;
while (right < s.size())
{
if (s[right] == ' ')
{
while (right < s.size() && s[right] == ' ') right++;
if (right < s.size())
{
s[left++] = ' ';
}
}
else
{
s[left++] = s[right++];
}
}
s.erase(s.begin() + left, s.end());
return s;
}
整体代码
class Solution {
public:
string reverseWords(string s) {
// 清除多余的空格
int left = 0, right = 0;
while (s[right] == ' ') right++;
while (right < s.size())
{
if (s[right] == ' ')
{
while (right < s.size() && s[right] == ' ') right++;
if (right < s.size())
{
s[left++] = ' ';
}
}
else
{
s[left++] = s[right++];
}
}
s.erase(s.begin() + left, s.end());
left = 0, right = 0;
while (right < s.size())
{
if (s[right] == ' ')
{
reverse(s.begin() + left, s.begin() + right);
right++;
left = right;
}
else
{
right++;
}
}
reverse(s.begin() + left, s.end());
reverse(s.begin(), s.end());
return s;
}
};
剑指 Offer 58 - II. 左旋转字符串
基操
class Solution {
void reverseSubStr(string &s, int left, int right)
{
right--;
while (left < right)
{
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
public:
string reverseLeftWords(string s, int n) {
reverseSubStr(s, 0, n);
reverseSubStr(s, n, s.size());
reverse(s.begin(), s.end());
return s;
}
};