LeetCode344
题目:
![](https://img-blog.csdnimg.cn/4d11396681e743acbe258d17fcb23940.png)
双指针(出乎意料的简单)
class Solution {
public:
void reverseString(vector<char>& s) {
int i=0,j=s.size()-1;
while(i<j)
{
char tmp;
tmp = s[i];
s[i] = s[j];
s[j] = tmp ;
i++;
j--;
}
}
};
LeetCode541
题目:
![](https://img-blog.csdnimg.cn/729c89b54acc4defa671e8e5982c7c5e.png)
本人解法:(双指针加暴力)
class Solution {
public:
string reverseStr(string s, int k) {
int i ,j;
int de = 0;
while(de < s.size())
{
if((s.size() - 1 - de) < k)
{
i = de;
j = s.size()-1;
while(i < j)
{
swap(s[i],s[j]);
i++;
j--;
}
}
else
{
i = de;
j = de + k - 1;
while(i < j)
{
swap(s[i],s[j]);
i++;
j--;
}
}
de+=2*k;
}
return s;
}
};
使用库函数reverse
class Solution {
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += (2 * k)) {
// 1. 每隔 2k 个字符的前 k 个字符进行反转
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if (i + k <= s.size()) {
reverse(s.begin() + i, s.begin() + i + k );
} else {
// 3. 剩余字符少于 k 个,则将剩余字符全部反转。
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
剑指offer 05
题目:
![](https://img-blog.csdnimg.cn/1d71bb587bcd47f8b730ff0867d31f68.png)
本人解法:(暴力解法)
class Solution {
public:
string replaceSpace(string s) {
int j;
string s1;
for(j = 0;j < s.size();j++)
{
if(s[j]==' ')
{
s1.push_back('%');
s1.push_back('2');
s1.push_back('0');
}
else
s1.push_back(s[j]);
}
return s1;
}
};
标准答案:(双指针,操作原数组,节省空间)
class Solution {
public:
string replaceSpace(string s) {
int count = 0; // 统计空格的个数
int sOldSize = s.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') {
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小
s.resize(s.size() + count * 2);
int sNewSize = s.size();
// 从后先前将空格替换为"%20"
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
if (s[j] != ' ') {
s[i] = s[j];
} else {
s[i] = '0';
s[i - 1] = '2';
s[i - 2] = '%';
i -= 2;
}
}
return s;
}
};
LeetCode151
题目:
![](https://img-blog.csdnimg.cn/06c7e1c132154e3f900f9e0c75e08b62.png)
标准解法:(先去除空格,再全部翻转,再翻转部分)
class Solution {
public:
void deletespace(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);
}
void reverse(string& s,int start, int end){
int i=start;
int j=end;
for(i,j;i<j;i++,j--)
swap(s[i],s[j]);
}
string reverseWords(string s) {
deletespace(s);
reverse(s,0,s.size()-1);
for(int i=0;i<s.size();i++)
{
int j = i;
while(j<s.size() && s[j] != ' ') j++;
reverse(s,i,j-1);
i = j;
}
return s;
}
};
剑指offer58-II
题目:
![](https://img-blog.csdnimg.cn/61d69d94774e41938dbe417721ad5621.png)
本人解法1:(用额外数组存储)
class Solution {
public:
string reverseLeftWords(string s, int n) {
string tmp;
int i = 0;
while(i<n)
{
tmp.push_back(s[i]);
i++;
}
for(i;i<s.size();i++)
s[i-n] = s[i];
int j = 0;
for(i=s.size()-n;i<s.size();i++)
s[i]=tmp[j++];
return s;
}
};
本人解法2:(通过翻转函数)
class Solution {
public:
void reverse(string& s,int start,int end)
{
int i = start;
int j = end;
for(i,j;i<j;i++,j--)
swap(s[i],s[j]);
}
string reverseLeftWords(string s, int n) {
reverse(s,0,n-1);
reverse(s,n,s.size()-1);
reverse(s,0,s.size()-1);
return s;
}
};
感悟:
- 此类字符串题目主要涉及到翻转,如何翻转才能达到最佳结果是解题关键
- reverse的用法还需要牢记