#include<iostream> #include<string> using namespace std; int main(){ string str; cin>>str; int n=str.size(); int sign[n]={1}; //查找各字符个数 for(int i=0;i<n-1;i++){ for(int j=i+1;j<n;j++){ if(str[i]==str[j]){ sign[i]++; } } } string result; for(int i=0;i<n;i++){ if(sign[i]==1){ result+=str[i]; } } cout<<result; return 0; } 这段代码实现上述功能,如何修改
时间: 2025-03-16 10:13:39 浏览: 16
改进方案
为了实现去除字符串中重复字符的功能,可以采用一种高效的方式:利用辅助数据结构(如 std::unordered_set
或布尔数组)来跟踪已访问过的字符,并通过一次遍历完成去重操作。以下是具体方法:
方法描述
- 使用一个容器(如
std::unordered_set<char>
或大小为 256 的布尔数组),用于存储已经遇到的字符。 - 创建一个新的空字符串作为结果字符串。
- 遍历输入字符串中的每一个字符:
- 如果该字符尚未被记录,则将其加入到结果字符串中,并标记为已访问。
- 如果该字符已被记录,则跳过它。
这种方法的时间复杂度为 O(n),其中 n 是字符串的长度,因为每个字符最多只会被处理两次(一次插入集合,一次检查是否存在)。空间复杂度取决于字符集的大小,在 ASCII 字符集中为 O(1)[^1]。
实现代码
以下是一个基于上述思路的 C++ 实现:
#include <iostream>
#include <string>
#include <unordered_set>
std::string removeDuplicates(const std::string& input) {
std::unordered_set<char> seen; // 记录已见过的字符
std::string result;
for (char ch : input) {
if (seen.find(ch) == seen.end()) { // 如果未见过此字符
result += ch;
seen.insert(ch); // 将其标记为已见
}
}
return result;
}
int main() {
std::string str = "programming";
std::string uniqueStr = removeDuplicates(str);
std::cout << "Original string: " << str << "\n";
std::cout << "String after removing duplicates: " << uniqueStr << "\n";
return 0;
}
输出示例
对于输入 "programming"
,输出将是:
Original string: programming
String after removing duplicates: progamin
这段代码实现了仅保留第一次出现的字符并移除后续重复项的目标。
进一步优化
如果希望减少额外的空间开销,可以通过位运算代替 std::unordered_set
来追踪字符的存在状态。假设我们只需要处理标准 ASCII 字符(共 128 个字符),可以用一个整数数组或单个整型变量来表示这些字符的状态。
基于位图的实现
#include <iostream>
#include <string>
std::string removeDuplicatesBitMap(const std::string& input) {
int charSet[4] = {0}; // 每个整数代表 32 个字符,总共可覆盖 128 个 ASCII 字符
std::string result;
for (char ch : input) {
if (ch >= ' ' && ch <= '~') { // 处理可见 ASCII 范围内的字符
int idx = static_cast<int>(ch) / 32;
int pos = static_cast<int>(ch) % 32;
if (!(charSet[idx] & (1 << pos))) { // 若字符未出现过
result += ch;
charSet[idx] |= (1 << pos); // 标记为已见
}
}
}
return result;
}
int main() {
std::string str = "hello world!";
std::string uniqueStr = removeDuplicatesBitMap(str);
std::cout << "Original string: " << str << "\n";
std::cout << "String after removing duplicates using bit map: " << uniqueStr << "\n";
return 0;
}
这种实现方式进一步减少了内存占用,适用于特定场景下的性能优化需求。
注意事项
- 上述两种方法均假定输入字符串由 ASCII 字符组成。如果是 Unicode 字符串,则需要调整策略以适应更大的字符范围。
- 对于非常大的字符串,可能需要考虑更高效的算法或者分批处理机制。
相关推荐


















