「算法刷题」字符串相关题目1

LeetCode题目 相关题目类型 相关链接
t替换空格(简单难度) 剑指 Offer 05. 替换空格

题解链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/solution/mian-shi-ti-05-ti-huan-kong-ge-ji-jian-qing-xi-tu-/
来源:力扣(LeetCode)

题解上有视频

1、初始化:空格数量 count ,字符串 s 的长度 len ;

2、统计空格数量:遍历 s ,遇空格则 count++ ;
3、修改 s 长度:添加完 “%20” 后的字符串长度应为 len + 2 * count ;

4、倒序遍历修改:i 指向原字符串尾部元素, j 指向新字符串尾部元素;当 i = j 时跳出(代表左方已没有空格,无需继续遍历);
当 s[i] 不为空格时:执行 s[j] = s[i] ;
当 s[i] 为空格时:将字符串闭区间 [j-2, j] 的元素修改为 “%20” ;由于修改了 3 个元素,因此需要 j -= 2 ;
5、返回值:已修改的字符串 s ;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
string replaceSpace(string s) {
int count = 0, len = s.size();
// 统计空格数量
for (char c : s) {
if (c == ' ') count++;
}
// 修改 s 长度
s.resize(len + 2 * count);//多加两个空格数,因为字符串本身有一个,再加两个(才能放下%20)
// 倒序遍历修改
for(int i = len - 1, j = s.size() - 1; i < j; i--, j--) {
if (s[i] != ' ')
s[j] = s[i];
else {
s[j - 2] = '%';
s[j - 1] = '2';
s[j] = '0';
j -= 2;
}
}
return s;
}
};


LeetCode题目 相关题目类型 相关链接
剑指offer左旋转字符串(简单难度) 剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode) (leetcode-cn.com)
1
2
3
4
5
6
7
8
9
class Solution {
public:
string reverseLeftWords(string s, int n) {
string str1;
str1 =s.substr(0,n);
s.erase(0,n);//即从给定起始位置0处开始删除, 要删除字符的长度为n, 返回值修改后的string对象引用
return s+str1;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
string reverseLeftWords(string s, int n) {
string str="";
for(int i=n;i<s.size();i++){
str+=s[i];
}
for(int i=0;i<n;i++){
str+=s[i];
}
return str;
}
};
LeetCode题目 相关题目类型 相关链接
151 反转字符串里的单词(中等难度) 151. 翻转字符串里的单词 - 力扣(LeetCode) (leetcode-cn.com)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

class Solution {
public:
// 反转字符串
void reverse(string &s,int start,int end){
int i=start;
int j=end;
for(;i<j;i++,j--){
swap(s[i],s[j]);
}
}
// 移除冗余空格
// 考虑字符串s前中后空格的位置和fast的大小是否符合循环要求
void removeExtraStr(string &s){
int fast=0,slow=0;
//移除字符串前面多余的空格
while(s[fast]==' '//表示字符串前有空格
&&s.size()>0//字符串s不为空
&&fast<s.size())//fast不能指到s外
{
fast++;//结束循环后,fast指向第一个不是空格的字符
}
//移除字符串中间多余的空格
for(;fast<s.size();fast++){
if(fast-1>0&&
s[fast]==' '&&
s[fast-1]==' '){//连续两个空格不做操作
continue;
}
else{//直到fast指向一个字符,前一个是空格,把fast指向的字符赋值给slow指向的位置
s[slow]=s[fast];
slow++;
}
}
//移除字符串后面多余的空格
if(s[slow-1]==' '){//fast指向空格,fast-1指向字符,这时候也执行了s[slow]=s[fast];所以多加了一个空格,如果指向反转字符串的操作,该空格在最前面
s.resize(slow-1);
}
else{
s.resize(slow);
}
}
string reverseWords(string s) {
// 移除多余空格
removeExtraStr(s);
// 反转字符串
reverse(s,0,s.size()-1);
//反转单个单词
int start=0;
for(int i=0;i<s.size();i++){
if(s[i]==' '&&s[i-1]!=' '){
reverse(s,start,i-1);
start=i+1;
}
// 最后一个单词后没有空格的情况
if((i == (s.size() - 1) )&& s[i] != ' '){
reverse(s,start,i);

}

}
return s;

}
};