代码随想录第八天||344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
一、344. 反转字符串
题目链接
该题思路比较简单,通过双指针法依次调换首尾字符顺序。
class Solution {
public:
void reverseString(vector<char>& s) {
char temp;
int right = s.size()-1;
int left = 0;
while(left<right){
temp = s[right];
s[right] = s[left];
s[left] = temp;
left++;
right--;
}
}
};
二、541. 反转字符串II
题目链接
自己做的思路上是对的,但是做得有点繁杂,不易懂且操作过多。
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.length();
//if( n < k) return s;
int count = n / k;
for(int i = 0; i <= count; i=i+2){
for(int m = i*k, l = (((i+1)*k-1)<n?((i+1)*k-1):n-1); m<=(m+l)/2; m++,l--){
swap(s[m],s[l]);
}
}
return s;
}
};
看了carl哥讲解后的代码,简洁了不少,以后需要写个子函数把功能分开。
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 reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i=i+2*k){
if( i+k <= s.size()){
reverse(s,i,i+k-1);
}
else{
reverse(s,i,s.size()-1);
}
}
return s;
}
};
三、剑指Offer 05.替换空格
题目链接
这题首先要重新设定一下字符串的长度,而遍历顺序的话如果从前先后遍历,则找到空格的时候则需要把后面的字符对应移动两位,时间复杂度为O(
n
2
n^2
n2)。而从后向前遍历,则不需要移动前面的字符。时间复杂度为O(
n
n
n);
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
for(auto c:s){
if(c==' '){
count++;
}
}
s.resize(s.size() + count*2);
for(int j = s.size()-1,i = s.size() -1 - count *2; i >= 0; i--,j--){
if(s[i] != ' '){
s[j] = s[i];
}
else{
s[j--] = '0';
s[j--] = '2';
s[j] = '%';
}
}
return s;
}
};
四、151.翻转字符串里的单词
题目链接
这题比较困难,首先在思路上就没有理顺,看了Carl哥的解析,整体上思路算是比较清晰了,但我就是没想到。另一方面是每一次步骤的代码实现比较困难。但也是利用已经刷过的题的思路,没做出来实在不应该。看完答案后写的代码。
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 deletespace(string& s){
int slow = 0;
for(int i = 0; i<s.size();i++){
if(s[i] != ' '){
if(slow > 0) s[slow++] = ' ';
while(s[i] != ' ' && i<s.size()){
s[slow++] = s[i++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
deletespace(s);
int n = s.size();
reverse(s, 0, n-1);
int start = 0;
for(int i = 0; i <= n; i++){
if(s[i] == ' ' || i == n){
reverse(s, start, i-1);
start = i+1;
}
}
return s;
}
};
五、剑指Offer58-II.左旋转字符串
题目链接
这题比较简单省时的方法没有想到,可以利用局部和整体的字符串反转来实现左旋转字符串。只写出了按出栈进栈思想的暴力解法。
暴力解法如下:
class Solution {
public:
string reverseLeftWords(string s, int n) {
int m = s.size();
for(int i = 0; i < n; i++){
int temp = s[0];
for(int j = 0; j < m-1; j++){
s[j] = s[j+1];
}
s[m-1] = temp;
}
return s;
}
};
局部和整体的字符串反转解法:
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
reverse(s.begin(), s.end());
return s;
}
};
六、总结
字符串的的定义和数据类型相对简单,难的是解题的思路与双指针法的应用。