● 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]);
}
}
};
● 541. 反转字符串II
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;
}
};
● 05.替换空格
class Solution {
public:
string replaceSpace(string s) {
int count=0;
int sOldize=s.size();
for(int i=0;i<s.size();i++){
if(s[i]==' '){
count++;
}
}
s.resize(s.size()+2*count);
int snewsize=s.size();
for(int i=snewsize-1,j=sOldize-1;j<i;i--,j--){
if(s[j]!=' '){
s[i]=s[j];
}else{
s[i]='0';
s[i-1]='2';//s[i-1]=2;要把字符赋值,不要把本体
s[i-2]='%';
i=i-2;
}
}
return s;
}
};
● 151.翻转字符串里的单词
-
int slow = 0;
: 这里声明了一个慢指针slow
,它将用于构建处理后的字符串。初始时指针位置为 0。 -
循环
for (int i = 0; i < s.size(); ++i) {
: 遍历输入字符串中的每个字符。 -
if (s[i] != ' ') {
: 如果当前字符不是空格。 -
if (slow != 0) s[slow++] = ' ';
: 这个条件用于判断是否需要在单词之间添加空格。如果slow
不等于 0,说明不是第一个单词,那么在慢指针位置添加一个空格,然后递增slow
。 -
while (i < s.size() && s[i] != ' ') {
: 这是一个循环,它会在当前字符不是空格的情况下一直执行,直到遇到空格或者字符串结束。这个循环用于将一个单词中的非空格字符复制到慢指针位置,从而构建一个单词。 -
s[slow++] = s[i++];
: 这行代码将输入字符串中的非空格字符复制到慢指针位置,并且同时递增slow
和i
,以继续处理下一个字符。 -
s.resize(slow);
: 循环结束后,slow
指向处理后字符串的末尾。通过调整字符串的长度为slow
,将去除多余空白之后的处理后字符串设置为新的字符串内容。
综合来看,这个函数通过使用两个指针(一个快指针 i
和一个慢指针 slow
),在遍历输入字符串的过程中,将单词之间多余的空格去除,并在需要的位置添加一个空格,以便最终构建出符合要求的字符串。
//代码有问题,无法在leetcode中提交
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 removeextraspace(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) {
removeextraspace(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;
}
};