剑指 Offer 05. 替换空格
题目描述: 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例:
输入:s = "We are happy."
输出:"We%20are%20happy.
我的第一反应下的解答思路:
既然要将字符串中的空格替换掉,首先就是要找到字符串中所有空格的索引,先将这些索引值存储起来,然后按照索引的位置将字符串分隔成若干个子串,然后用"%20"将这些子串拼接起来。
实现:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Solution {
public:
string replaceSpace(string s) {
string a = " ";
vector<int> index;
for (int i = 0; i < s.length(); i++) {
if (s.substr(i,1) == a) {
index.push_back(i);
}
}
string res = "";
int index0 = 0;
for (int i = 0; i < index.size(); i++) {
res += s.substr(index0, index[i] - index0); //index0保存该子串的第一个字符的索引位置,
res += "%20"; //index[i]保存第i个空格的索引位置,然后去index0到index[i]这个部分的子串
index0 = index[i] + 1;
}
res += s.substr(index0, s.size() + 1 - index0);
return res;
}
};
int main(){
string s = "We are happy!";
Solution a;
string res = a.replaceSpace(s);
cout << res;
}
原地修改:
这是官方给的一种C++的一种解法,C++不像Python那么多函数直接用,贼舒服。但是C++的string类型是可变的就很舒服。
由于需要将空格替换为 “%20” ,字符串的总字符数增加,因此需要扩展原字符串 s 的长度,计算公式为:新字符串长度 = 原字符串长度 + 2 * 空格个数 ,示例如下图所示。
算法流程:
- 初始化:空格数量 count ,字符串 s 的长度 len ;
- 统计空格数量:遍历 s ,遇空格则 count++ ;
- 修改 s 长度:添加完 “%20” 后的字符串长度应为 len + 2 * count ;
- 倒序遍历修改:i 指向原字符串尾部元素, j 指向新字符串尾部元素;当 i = j 时跳出(代表左方已没有空格,无需继续遍历);
- 当 s[i] 不为空格时:执行 s[j] = s[i] ;
- 当 s[i] 为空格时:将字符串闭区间 [j-2, j] 的元素修改为 “%20” ;由于修改了 3 个元素,因此需要 j -= 2
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);
// 倒序遍历修改
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;
}
};
作者:jyd
链接: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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。