● 344.反转字符串
采用双指针法。
class Solution {
public:
void reverseString(vector<char>& s) {
for (int i =0, j = s.size()-1; i < j; i++, j-- ){
swap(s[i], s[j]);
}
}
};
● 541. 反转字符串II
通过自定义reverse函数与系统提供的reverse函数完成字符串的反转,其中系统调用的字符串函数为左闭右开。 引用类型的定义能够使传入的数据在内部进行修改,而不是通过创建变量的副本进行修改值。
class Solution {
public:
void reverse_(string &s, int start, int end){
for (int i = start, j = end; i < j; i++, j--){
swap(s[i], s[j]);
}
}
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i+=(2*k)){
// 1. 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
// 2. 如果剩余字符少于 k 个,则将剩余字符全部反转。
if (i+k <= s.size()){
//reverse(s.begin()+i, s.begin()+i+k);
reverse_(s, i, i+k-1);
} else{
//reverse(s.begin()+i, s.end());
reverse_(s, i, s.size()-1);
}
}
return s;
}
};
● 剑指Offer 05.替换空格
相关字符串api的使用:resize()扩充原字符串长度。
目前许多数组填充问题采取的方式都是从后往前填充扩容大小,然后再对元素操作,好处有:
- 不用申请新数组。
- 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
class Solution {
public:
string replaceSpace(string s) {
// 遍历看有多少 空格
int count = 0;
int oldlen = s.size() - 1;
for (int i = 0; i < s.size(); i++){
if (s[i] == ' '){
count++;
}
}
s.resize(s.size() + 2*count);
int newlen = s.size() - 1;
for (int i = oldlen, j = newlen; i < j; i--, j--){
if (s[i] != ' '){
s[j] = s[i];
} else{
s[j] = '0';
s[j-1] = '2';
s[j-2] = '%';
j -= 2;
}
}
return s;
}
};
● 151.翻转字符串里的单词
分三步走:1.去除前后及冗余空格;2.整个区间反转 3.按照空格控制,局部区间反转
void reverseFunc(string &s, int start, int end){
for (int i = start, j = end; i < j; i++, j--){
swap(s[i], s[j]);
}
}
// 快慢指针
void removeSpace(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);
}
string reverseWords(string s) {
removeSpace(s);
reverseFunc(s, 0, s.size() - 1);
int start = 0;
for (int i = 0; i <= s.size(); i++){
if (s[i] == ' ' || i == s.size()){
reverseFunc(s, start, i-1);
start = i+1;
}
}
return s;
}
剑指Offer58-II.左旋转字符串
这样旋转的实现,通过两个区间分别的reverse,然后再通过全局的reverse实现左旋的实现。
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;
}
};