剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
来源:力扣(LeetCode)
链接:https:///problems/ti-huan-kong-ge-lcof
class Solution {
public:
string replaceSpace(string s) {
int count=0;
int length=s.size();
for(char h:s){
if(h==' '){
count++;
}
}
s.resize(length+2*count);
for(int i=length-1,j=s.size()-1;i<j;i--,j--){
if(s[i]!=' '){
s[j]=s[i];
}else{
s[j]='0';
s[j-1]='2';
s[j-2]='%';
j=j-2;
}
}
return s;
}
};
当然!让我们逐步解释给定的 C++ 代码,并提供详细的中文版本解析:
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
int length = s.size();
// 步骤 1:计算输入字符串 's' 中空格的个数
for (char h : s) {
if (h == ' ') {
count++;
}
}
// 步骤 2:调整字符串大小,以容纳替换空格后所需的额外字符
s.resize(length + 2 * count);
// 步骤 3:使用双指针方法,从后向前遍历字符串,并将空格替换为 '%20'
for (int i = length - 1, j = s.size() - 1; i < j; i--, j--) {
if (s[i] != ' ') {
s[j] = s[i];
} else {
s[j] = '0';
s[j - 1] = '2';
s[j - 2] = '%';
j = j - 2;
}
}
// 步骤 4:返回替换空格后的修改后的字符串
return s;
}
};
解析:
-
函数
replaceSpace
接受一个字符串s
作为输入,并返回一个修改后的字符串,其中原始字符串中的所有空格都被替换为 ‘%20’。 -
变量
count
被初始化为 0,并且length
被设置为输入字符串s
的长度。 -
第一个循环(步骤 1)遍历输入字符串
s
中的每个字符h
,并计算空格的数量。计数存储在变量count
中。 -
在步骤 2 中,调整字符串
s
的大小,以容纳替换空格后所需的额外字符。由于每个空格被替换为三个字符(‘%20’),所以新的字符串s
的大小设置为length + 2 * count
。 -
在步骤 3 中,使用双指针方法,从后向前遍历字符串
s
。变量i
和j
初始化为length - 1
和s.size() - 1
,分别表示字符串的末尾位置。循环继续,直到i
小于j
。 -
在循环内部,如果位置
i
处的字符不是空格,则将其复制到位置j
,从而将字符向末尾移动,为%20
留出空间。 -
如果位置
i
处的字符是空格,这意味着我们需要将其替换为%20
。因此,将字符 ‘0’、‘2’ 和 ‘%’ 分别放置在位置j
、j - 1
和j - 2
,然后更新j
为j - 2
,以后退两个位置,因为我们已经添加了三个字符。 -
循环继续,直到所有空格都被替换为
%20
。 -
最后,返回修改后的字符串
s
(步骤 4),其中空格已经被替换为 ‘%20’。
例如,如果输入字符串 s
是 “hello world”,则该函数的输出将是 “hello%20world”。