文章目录
前言
一、反转字符串(LeetCode--344)
二、反转字符串II(LeetCode--541)
三、反转字符串中的单词(LeetCode--151)
前言
跟随代码随想录,学习字符串相关的算法题目,记录学习过程中的tips。
一、反转字符串(LeetCode--344)
【1】题目描述:
【2】解决思想:首尾指针法,交换首尾指针对应的元素,直到首尾指针相遇。
【3】C++代码:
class Solution {
public:
void reverseString(vector<char>& s) {
int low = 0, end = s.size() - 1;
while (low < end) {
char tmp = s[low];
s[low] = s[end];
s[end] = tmp;
low++;
end--;
}
}
};
【4】时间复杂度:O(N)
【5】空间复杂度:O(1)
二、反转字符串II(LeetCode--541)
【1】题目描述:
【2】解决思想:每次让i走2k步,立足当下的i,反转属于[i,i+k)范围内的元素,若到末尾不够k则反转全部。
【3】C++代码:
class Solution {
private:
void reverse(string &s, int low, int high) {
high--;
while (low < high) {
char tmp = s[low];
s[low] = s[high];
s[high] = tmp;
low++;
high--;
}
}
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += 2*k) {//每次走2k
if (i+k <= s.size()) {//反转前k个
reverse(s, i, i+k);
} else {//末尾反转剩余
reverse(s, i, s.size());
}
}
return s;
}
};
【4】时间复杂度:O(N)
【5】空间复杂度:O(1)
三、反转字符串中的单词(LeetCode--151)
【1】题目描述:
【2】解决思想:首先,双指针法移除字符串中多余字符(舍弃开头和结尾,中间保留一个)。其次,反转整个字符串。最后,反转单独字符串中的单词。
【3】C++代码:
class Solution {
private:
void reverse(string& s, int low, int high) {
high--;
while (low < high) {
char tmp = s[low];
s[low] = s[high];
s[high] = tmp;
low++;
high--;
}
}
public:
string reverseWords(string s) {
//双指针移除多余空格
int low = 0;
for (int high = 0; high < s.size(); high++) {
if (s[high] != ' ') {
if (low != 0) {//单词间保留一个空格
s[low++] = ' ';
}
while (high < s.size() && s[high] != ' ') {//保留整个单词
s[low++] = s[high++];
}
}
}
s.resize(low);
//整体反转(左闭右开)
reverse(s, 0, s.size());
//每个单词反转
int start = 0;
for (int i = 0; i <= s.size(); ++i) {
if (s[i] == ' ' || i == s.size()) {
reverse(s, start, i);
start = i + 1;
}
}
return s;
}
};
【4】时间复杂度:O(N)
【5】空间复杂度:O(1)