字符串原地修改双指针经典实现
字符串原地修改经常遇到的一类题,双指针一个用于写入,一个用于扫描,互不干扰,各司其职。
这类双指针可以模拟栈,很多情况下比真正的栈要更灵活好用。
题目:https://leetcode.cn/problems/reverse-words-in-a-string/
string reverseWords(string s) {
reverse(s.begin(), s.end());
int write = 0, scan = 0;
while (scan <= s.size()) {
if (scan == s.size() || s[scan] == ' ') {
// 屏蔽开头是空格情况
if (write == 0) {
scan++;
continue;
}
// 反转单词
int w = write - 1;
while (w >= 0 && s[w] != ' ') w--;
reverse(s.begin() + w + 1, s.begin() + write);
// scan后面没有有效单词退出
while (scan < s.size() && s[scan] == ' ') scan++;
if (scan == s.size()) break;
// 单词之间补充空格
s[write++] = ' ';
} else {
s[write++] = s[scan++];
}
}
return s.substr(0, write);
}
题目:https://leetcode.cn/problems/asteroid-collision/
栈模拟
vector<int> asteroidCollision(vector<int>& asteroids) {
int write = 0, scan = 0;
while (scan < asteroids.size()) {
if (write == 0 || !(asteroids[scan] < 0 && asteroids[write - 1] > 0)) {
asteroids[write++] = asteroids[scan++];
} else if (abs(asteroids[scan]) > abs(asteroids[write - 1])) {
write--;
} else if (abs(asteroids[scan]) == abs(asteroids[write - 1])) {
write--;
scan++;
} else {
scan++;
}
}
while (asteroids.size() > write) {
asteroids.pop_back();
}
return asteroids;
}
题目:https://leetcode.cn/problems/string-compression/
int compress(vector<char>& chars) {
int write = 0, i = 0;
while (i < chars.size()) {
if (i + 1 < chars.size() && chars[i] == chars[i + 1]) {
chars[write++] = chars[i++];
int count = 2;
while (i + 1 < chars.size() && chars[i] == chars[i + 1]) {
i++;
count++;
}
i++;
stack<char> s;
while (count) {
s.push('0' + count % 10);
count /= 10;
}
while (!s.empty()) {
chars[write++] = s.top();
s.pop();
}
} else {
chars[write++] = chars[i++];
}
}
return write;
}
题目:https://leetcode.cn/problems/removing-stars-from-a-string/
string removeStars(string s) {
int write = 0, scan = 0;
while (scan < s.size()) {
if (s[scan] == '*') {
write--;
scan++;
continue;
}
s[write++] = s[scan++];
}
return s.substr(0, write);
}
本文来自博客园,作者:linukey,转载请注明原文链接:https://www.cnblogs.com/linukey/p/17430599.html