目录
LeeCode 344.反转字符串
思路:
双指针分别从字符串首尾遍历数组,每次进行交换,直至左指针遍历到数组中间。
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]);
}
}
};
LeeCode 541.反转字符串II
思路:
在遍历字符串的过程中,让 i += (2 * k),i 每次移动 2 * 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;
}
};
LeeCode 剑指offer05.替换空格
思路:
扩充原数组到每个空格替换成“%20”后的大小,利用双指针法从后向前替换空格。
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() + count * 2);
int snewsize = s.size();
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;
}
};
时间复杂度:O(n) 空间复杂度:O(1)
LeeCode 151.反转字符串中的单词
思路:
先删去多余空格,翻转整个字符串,翻转每个单词。
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]);
}
}
//去除所有空格并在相邻单词间添加空格,快慢指针
void removeextraspaces(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) {
removeextraspaces(s);
reverse(s, 0, s.size() - 1);
int start = 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;
}
};
LeeCode 剑指offer58-II.左旋转字符串
思路:
反转区间为前n的子串;反转区间为n到末尾的子串;反转整个字符串。
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;
}
};
总结:
1.尽管解题的关键步骤可以调用库函数,但为了加深理解打基础,还是自己写比较好。其余非关键部分可以使用库函数。
2.替换空格中从后向前而非从前向后是因为,若从前向后,替换过的元素后边的元素都需要再次移动,时间复杂度为O(n²)。
3.反转字符串中的单词:移除空格操作:移除字符串前的空格、移除单词之间的空格、移除字符串后的空格,比较复杂,可以通过移除所有空格,然后在单词之间再添加空格实现。 (思路参考:27.移除元素)