代码随想录第8天| 字符串1
344.反转字符串 (简单)
LeetCode题目: 344.反转字符串
代码随想录: 344.反转字符串
题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
秒了
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]);
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}
};
541. 反转字符串II(简单)
LeetCode题目:541. 反转字符串II
代码随想录:541. 反转字符串II
题目描述:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
i的步长为2k,
剩余字符少于k: size-1-i+1 < k ,则有 i+k > size
public:
void reverseString(string& s, int start, int end) {
for(int i = start, j = end; i < j; i++, j--){
// 可以直接用swap(s[i],s[j]);
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}
string reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i+= 2*k){ // 步长为2k
if(i+k > s.size()) // 剩余字符 size-1-i+1 < k -> i+k>size
reverseString(s, i, s.size()-1);
else
reverseString(s, i, i+k-1); // k个字符
}
return s;
}
};
可以直接用reverse
string reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i+=2*k){
if(i+k>s.size()) // 剩余字符少于k个
reverse(s.begin()+i, s.end()); // 索引为i
else
reverse(s.begin()+i, s.begin()+i+k);
}
return s;
}
剑指Offer 05.替换空格(简单)
LeetCode题目:剑指Offer 05.替换空格
代码随想录:剑指Offer 05.替换空格(https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html)
题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
扩充数组到每个空格替换成"%20"之后的大小。
然后从后向前替换空格
class Solution {
public:
string replaceSpace(string s) {
// 先扩容
int count = 0;
int i = s.size() -1;
for(char ch : s)
if(ch == ' ')
count++;
s.resize(s.size() + 2 * count);
for(int j = s.size() -1; i>=0; i--,j-- ){
if(s[i] == ' '){
s[j--] = '0';
s[j--] = '2';
s[j] = '%';
} else{
s[j] = s[i];
}
}
return s;
}
};
注:用resize()扩容后,改变字符串长度属性(length): length() 或 size() 成员函数来获取字符串的长度属性,即字符串中实际包含的字符数。
但字符串实际长度不变,扩容部分默认补’\0’,可以通过迭代器遍历字符串来获取非空字符数(不包括 \0)
151.翻转字符串里的单词 (中)
LeetCode题目: 151.翻转字符串里的单词
代码随想录: 151.翻转字符串里的单词
题目描述:
1.先去掉多余的空格 :
双指针,只保留每个单词之前的一个空格,
注意:第一个单词之前要去掉空格 slow > 0 && s[fast - 1] == ’ ’ (第一个条件放前面,&&判断的特性,写反了会报错)
2.翻转整个字符串
3.以空格为界翻转每个单词:双指针
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 spaceRemove(string & s){
int slow = 0;
for(int fast = 0; fast < s.length(); fast++){
if(s[fast] != ' '){
if(slow > 0 && s[fast - 1] == ' '){
s[slow++] = ' ';
}
s[slow++] = s[fast];
}
}
s.resize(slow);
}
string reverseWords(string s) {
spaceRemove(s);
// 整体翻转
reverse(s, 0, s.size()-1);
for(int i=0, j=0; j <= s.size(); j++){
if(j == s.size() || s[j] == ' '){
reverse(s, i, j-1);
i = j + 1;
}
}
return s;
}
};
剑指Offer58-II.左旋转字符串(简单)
LeetCode题目: 剑指Offer58-II.左旋转字符串
代码随想录: 剑指Offer58-II.左旋转字符串
题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
思路跟上面翻转单词一样,还剩了去掉空格的步骤
先分别把两段字符串翻转,再整体翻转字符串
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 reverseLeftWords(string s, int n) {
reverse(s, 0, n-1);
reverse(s, n, s.size()-1);
reverse(s, 0, s.size()-1);
return s;
}
};