# 字符串
字符串特点
题目
151. 反转字符串中的单词 - 力扣(LeetCode)
先将字符串整体反转,然后对每个单词再次反转,去掉多余空格即可
去掉多余空格参考数组移除元素
反转元素使用双指针
单词判断通过空格判断,其中字符遍历要到单词\0 位置
void Reverse(string& s, int left, int right) {
char tmp;
right--;
while (right > left) {
tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
void RemoveSpace(string& s) {
// _hello__word
int slow = 0, fast = 0;
for (fast = 0; fast < s.length(); ++fast) {
if (s[fast] != ' ') {
if (slow != 0) s[slow++] = ' ';
while (fast < s.length() && s[fast] != ' ') s[slow++] = s[fast++];
}
}
// 调整大小
s.resize(slow);
}
string reverseWords(string s) {
// 去空格
RemoveSpace(s);
// 整体反转
Reverse(s, 0, s.length());
// 局部反转
int start = 0;
for (int i = 0; i <= s.length(); ++i) {
if (i == s.length() || s[i] == ' ') {
Reverse(s, start, i);
start = i + 1;
}
}
return s;
}
55. 右旋字符串(第八期模拟笔试)
ABCDefgh -> hgfeDCBA -> efghABCD
类似于上一题首先对整体反转,然后对两个字串分别反转即可
#include <iostream>
#include <string>
void Reverse(std::string& s, int left, int right) {
right--;
char tmp;
while (right > left) {
tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
int main() {
int n;
std::string s;
std::cin >> n;
std::cin >> s;
// 整体反转
Reverse(s, 0, s.length());
// 局部反转
Reverse(s, 0, n);
Reverse(s, n, s.length());
std::cout << s << std::endl;
}
KMP
参考:代码随想录