1. 问题背景与需求分析
2047号题目"过滤空格"是信息学奥赛一本通中的经典字符串处理练习题。这类题目在NOIP/CSP等竞赛中频繁出现,主要考察选手对字符串基础操作和边界条件的处理能力。
题目核心要求是:给定一个可能包含连续多个空格的字符串,需要将其中连续的空格压缩为单个空格。例如:
- 输入:"hello world"(包含3个连续空格)
- 输出:"hello world"(仅保留1个空格)
这类问题在实际编程中非常常见。比如在文本编辑器、搜索引擎预处理、日志分析等场景中,都需要对原始文本进行规范化处理。连续空格不仅影响显示效果,还会干扰后续的字符串分割、索引建立等操作。
注意:题目特别说明输入字符串的首尾不会包含空格,这实际上降低了题目难度。在实际工程中,我们通常还需要处理首尾空格的情况。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础解法与实现思路
2.1 直接遍历法
最直观的解法是逐个字符遍历字符串,遇到连续空格时跳过后续空格。以下是C++实现示例:
cpp复制#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
getline(cin, s); // 读取整行输入
string result;
bool spaceFlag = false; // 标记前一个字符是否为空格
for (char c : s) {
if (c == ' ') {
if (!spaceFlag) { // 前一个不是空格才添加
result += c;
spaceFlag = true;
}
} else {
result += c;
spaceFlag = false;
}
}
cout << result << endl;
return 0;
}
这种方法的时间复杂度是O(n),空间复杂度也是O(n)(因为创建了新字符串)。在竞赛中,这种解法完全
