344. 反转字符串
数组两侧双指针向中间逼近两两交换元素。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
// c++
class Solution {
public:
void reverseString(vector<char>& s) {
int n = s.size();
for(int i=0; i<n/2; i++){
swap(s[i], s[n-i-1]);
}
}
};
541. 反转字符串 II
和上题相似。只是每访问一个元素,就反转当前元素(包含)之后的k个元素,然后指针后移2*k。
注意处理字符串尾部越界问题。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
// c++
class Solution {
public:
void reverse(string& s, int start, int end){
while(start<end){
swap(s[start], s[end]);
start++;
end--;
}
}
string reverseStr(string s, int k) {
for(int i=0; i<s.size(); i+=2*k){
if(i+k<s.size()){
reverse(s, i, i+k-1);
}else{
reverse(s, i, s.size()-1);
}
}
return s;
}
};
替换数字
先统计字符串中的数字个数,再将字符串扩展到一定长度(每个数字多加5个字符长度,因为原来的数字在字符串中已经占了一位),再从扩展前的串尾向前访问,访问到一个数字就替换为number。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
// c++
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
int cnt = 0;
cin>>s;
int oldidx = s.size();
for(int i=0; i<oldidx; i++){
if(s[i]>='0' && s[i]<='9') cnt++;
}
s.resize(oldidx + 5*cnt);
oldidx--;
int newidx = s.size()-1;
while(oldidx>=0){
if(s[oldidx]>='0' && s[oldidx]<='9'){
s[newidx--] = 'r';
s[newidx--] = 'e';
s[newidx--] = 'b';
s[newidx--] = 'm';
s[newidx--] = 'u';
s[newidx--] = 'n';
}else{
s[newidx--] = s[oldidx];
}
oldidx--;
}
cout<<s;
return 0;
}