1 力扣344.反转字符串
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
class Solution {
public:
void reverseString(vector<char>& s) {
char tmp;
for (int i = 0, j = s.size() - 1; i < s.size() / 2; i++, j--) {
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}
};
2 力扣541. 反转字符串II
题目描述:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
class Solution {
public:
string reverseStr(string s, int k) {
int i = 0;
while (i + 2 * k < s.size() && s.size() > 2 * k) {
reverse(s.begin() + i, s.begin() + i + k);
i += 2 * k;
}
if (s.size() - i < k) reverse(s.begin() + i, s.begin() + s.size());
else reverse(s.begin() + i, s.begin() + i + k);
return s;
}
};
3 力扣151.翻转字符串里的单词
题目描述:
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
class Solution {
public:
string reverseWords(string s) {
//空格剪枝
int slow = 0;
for (int i = 0; i < s.size(); ++i) {
if (s[i] != ' ') {
if (slow != 0) s[slow++] = ' ';
while (i < s.size() && s[i] != ' ') {
s[slow++] = s[i++];
}
}
}
s.resize(slow);
//反转单词
reverse(s.begin(), s.end());
int sl = 0, f = 0;
for (; f < s.size(); f++) {
if (s[f] != ' ') continue;
reverse(s.begin() + sl, s.begin() + f);
sl = f + 1;
}
reverse(s.begin() + sl, s.end());
return s;
}
};
空格剪枝
先总体反转s的每个元素,再分别反转每个单词的字母,可以实现单词反转
4 力扣459.重复的子字符串
题目描述:
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
掐头去尾判断是否还有子串
class Solution {
public:
bool repeatedSubstringPattern(string s) {
string t = s + s;
t.erase(t.begin()); t.erase(t.end() - 1);
if (t.find(s) != std::string::npos) return true;
return false;
}
};
KMP:
5 力扣剑指Offer 05.替换空格
题目描述:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
class Solution {
public:
string replaceSpace(string s) {
int t = s.size() - 1;
int cnt = 0;
for (int i = 0; i <= t; ++i) {
if (s[i] == ' ') cnt++;
}
if (!cnt) return s;
s.resize(t + 1 + cnt * 2);
int p = s.size()-1;
//while(t<p)很重要
while(t<p){
if (s[t] != ' ') s[p--] = s[t--];
else {
s[p - 2] = '%';
s[p - 1] = '2';
s[p] = '0';
p -= 3;
--t;
}
}
return s;
}
};
6 力扣剑指Offer58-II.左旋转字符串
题目描述:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
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;
}
};