一 344 反转字符串
比较简单的双指针
class Solution {
public:
void reverseString(vector<char>& s) {
for (int i = 0, j = s.size() - 1; i < j; i++, j--) {
swap(s[i],s[j]);
}
return;
}
};
二 反转字符串II
注意写myreverse()函数时,使用引用类型。string的size()函数和length()函数貌似有点区别
class Solution {
public:
void myreverse(string&s, int l, int r){
while(l < r){
swap(s[l],s[r]);
l++;
r--;
}
return;
}
int min(int a, int b){
return a<b?a:b;
}
string reverseStr(string s, int k) {
//l r分别是要反转的字符串的下标
int l = 0;
while(l < s.size()){
int r = min(l + k - 1,s.size() - 1);
myreverse(s,l,r);
l += 2*k;
}
return s;
}
};
三 替换数字
先根据要替换的数字的数目,扩容string的长度,再从后向前确定字符串的内容
#include<iostream>
using namespace std;
int main(){
string s;
while(cin>>s){
int k = s.size() - 1;
int count = 0;
for(int i = 0; i < s.size(); i++){
if(s[i]>='0'&&s[i]<='9')
count++;
}
s.resize(s.size() + count * 5);
int j = s.size() - 1;
while( k >= 0){
if(s[k]<='9'&&s[k]>='0'){
s[j--] = 'r';
s[j--] = 'e';
s[j--] = 'b';
s[j--] = 'm';
s[j--] = 'u';
s[j--] = 'n';
}
else{
s[j--] = s[k];
}
k--;
}
cout<<s<<endl;
}
}
四 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]);
}
}
string reverseWords(string s) {
int left = 0,right = s.size();
//整体反转
reverse(s,0,s.size()-1);
//双指针 去除多余空格
int fast = 0;
int slow = 0;
for(;fast < s.size(); fast++){
if(s[fast] != ' '){
if(slow != 0){
s[slow++] = ' ';
}
while (fast < s.size() && s[fast] != ' ') { //复制单词
s[slow++] = s[fast++];
}
}
}
s.resize(slow);
//翻转单词
int index = 0;
for(int i = 0; i <= s.size(); i++){
if(s[i] ==' '|| i == s.size()){
reverse(s,index,i - 1);
index = i + 1;
}
}
return s;
}
};
五 右旋字符串
整体反转再部分反转
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
string s;
cin >> n;
cin >> s;
int len = s.size(); //获取长度
reverse(s.begin(), s.begin() + len - n); // 先反转前一段,长度len-n ,
reverse(s.begin() + len - n, s.end()); // 再反转后一段
reverse(s.begin(), s.end()); // 整体反转
cout << s << endl;
}
六 总结
-
C++中对于字符串长度调整可采用resize()函数。
-
erase的时间复杂度是o(n)级别的,不要图方便滥用。
-
C++中,string类会提供 size接口,可以用来判断string类字符串是否结束,而用数组存储的字符串需要用’\0’来判断是否结束。
-
vector< char > 和 string在基本操作上没有区别,但是 string提供更多的字符串处理的相关接口,例如string 重载了+,而vector却没有。因此处理字符串时最好还是定义string类型。
-
C++中length()函数只能用来获取string类型长度,size()函数既可以获取string类型长度外,还可以获取vector类型的长度。