今天的专题记录的是除了需要用到KMP算法之外一些基础的操作字符串的方法。
这道题其实是对C++中reverse库函数的实现,reverse函数操作的区间默认左闭右开,自己实现定义的时候更自由了
class Solution {
public:
void reverseString(vector<char>& s) {
for (int i = 0, j = s.size() - 1; i < s.size() / 2; i++, j--) {
swap(s[i], s[j]);
}
}
};
这道题要求是每2k个字符反转前k个字符,最后剩余字符小于k个全部反转;大于k个则只反转前k个
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;
}
};
这道题在不使用辅助空间的条件下有两步操作:1:扩充数组。2:从后向前替换空格,避免从前向后移动的情况下需要移动新添加元素之后所有元素的问题。需要扩充数组的题一般都这么操作。
class Solution {
public:
string replaceSpace(string s) {
int count = 0; // 统计空格的个数
int sOldSize = s.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') {
count++;
}
}
s.resize(s.size() + 2 * count); // 扩充字符串
int sNewSize = s.size();
// 从后向前将空格替换成%20
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;
}
};
这道题不使用辅助空间的情况下有3个逻辑需要处理:移除单词间空格,先翻转整个字符串再翻转单词,移除空格的思想参照lc.27:移除元素,慢指针同时需要给合并到一起的单词添加空格。
class Solution {
public:
string reverseWords(string s) {
removeExtraSpaces(s);
reverse(s, 0, s.size() - 1);
int start = 0; // 移除空格后保证第一个单词下标是0
for (int i = 0; i <= s.size(); ++i) {
//先整个翻转,再在单词内翻转
if (i == s.size() || s[i] == ' ') {
//到达单词词尾
reverse(s, start, i - 1);
start = i + 1;
}
}
return s;
}
void removeExtraSpaces(string& s) {
int slow = 0;
for (int fast = 0; fast < s.size(); ++fast) {
if (s[fast] != ' ') { // 选取字符
if (slow != 0) s[slow++] = ' '; // 给单词之间加空格
while (fast < s.size() && s[fast] != ' ') {
s[slow++] = s[fast++];
}
}
}
s.resize(slow);
}
void reverse (string& s, int front, int end) {
//自定义翻转区间左闭右闭
for (int i = front, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
};
这道题要求切割前k个字符串放到末尾。在不使用辅助空间的情况下,参考上面题的思路,先翻转前k的字符串,再翻转之后的字符串,最后整体反转。
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;
}
};