目录
344、541. 反转字符串
简单模拟,没有难点
有时候双指针的想法真的能够减少很多代码量。
// 344
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i=0; i<(s.size()/2); i++){
swap(s[i], s[s.size()-1-i]);
}
}
};
// 541
class Solution {
public:
void reverselr(string &s, int l, int r){
while(l<r){
swap(s[l], s[r]);
l++;
r--;
}
}
string reverseStr(string s, int k) {
int i = 0;
int n = s.size();
for (i = 0; i < n; i = i+2*k){
if ( n-i >=k)
reverselr(s, i, i+k-1);
else
reverselr(s, i, n-1);
}
return s;
}
};
替换空格
技巧:不要使用额外空间,首先利用resize()函数将空间扩大到最终空间,然后从右往左移动指针,知道原指针和新指针相遇即可。
注意:从后向前的原因是,只用原string即可,不用担心数据覆盖的问题。
方法很巧妙,将双指针的方法做到了极致。
class Solution {
public:
string replaceSpace(string s) {
int n = s.size();
int m = n;
for (char a:s){
if (a==' ')
n += 2;
}
s.resize(n);
int l = m-1;
int r = n-1;
while(l<r){
if (s[l] == ' '){
s[r] = '0';
s[r-1] = '2';
s[r-2] = '%';
l--;
r = r-3;
}
else{
s[r] = s[l];
r--;
l--;
}
}
return s;
}
};
151. 反转字符串中的单词
方法一:利用字符串的合并
class Solution {
public:
string reverseWords(string s) {
string ans = "";
for (int i=0; i<s.size(); i++){
if (s[i]==' ')
continue;
string temp = ""; //记得要初始化
while(i<s.size() && s[i]!=' '){
temp += s[i];
i++;
}
if (ans!="")
temp = temp + " ";
ans = temp + ans;
}
return ans;
}
};
方法二:双指针
思路:利用双指针去重后,先将整体字符串反转,然后将内部各个单词反转
保证了空间复杂度是O(1)的.
class Solution {
public:
string reverseWords(string s) {
int i=0, j=0;
int n = s.size();
for (j=0; j<n; j++){
if (s[j]==' ')
continue;
if (i!=0)
s[i++] = ' ';
while(j<n && s[j] != ' '){
s[i] = s[j];
i++;
j++;
}
}
s.resize(i);
int start = 0;
reverse(s.begin(), s.end());
for (j=0; j<i; j++){
if (s[j]==' '){
reverse(s.begin()+start,s.begin()+j);
start = j+1;
}
}
reverse(s.begin()+start, s.end());
return s;
}
};
左旋转字符串
方法一:申请额外空间
class Solution {
public:
string reverseLeftWords(string s, int n) {
int l = s.size();
int t = n % l;
string ans="";
int i=t;
for (; i<l; i++){
ans += s[i];
}
for (int k=0; k<t; k++){
ans += s[k];
}
return ans;
}
};
方法二:整体翻转,然后内部分块翻转
注意:reverse()函数翻转的范围是左闭右开的
class Solution {
public:
string reverseLeftWords(string s, int n) {
int l = s.size();
int t = n % l;
if (t==0)
return s;
reverse(s.begin(), s.end());
reverse(s.begin(), s.end()-t);
reverse(s.end()-t, s.end());
return s;
}
};