解题思路
这是一个字符串处理问题。需要遍历字符串并记录每个字符的出现情况,以便只保留第一次出现的字符。
关键点:
- 使用集合记录已经出现的字符。
- 遍历字符串,构建结果字符串。
- 保持字符的原始顺序。
算法步骤:
- 初始化一个空集合用于存储已出现的字符。
- 初始化一个空字符串用于存储结果。
- 遍历输入字符串的每个字符:
- 如果字符不在集合中,则将其添加到结果字符串和集合中。
- 输出结果字符串。
代码
#include <iostream>
#include <unordered_set>
#include <string>
using namespace std;
string removeDuplicates(const string& s) {
unordered_set<char> seen; // 用于记录已出现的字符
string result; // 用于存储结果字符
for (char c : s) {
if (seen.find(c) == seen.end()) {
seen.insert(c); // 记录字符
result += c; // 添加到结果中
}
}
return result; // 返回结果字符串
}
int main() {
string s;
getline(cin, s); // 读取输入
cout << removeDuplicates(s) << endl; // 输出结果
return 0;
}
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static String removeDuplicates(String s) {
HashSet<Character> seen = new HashSet<>(); // 用于记录已出现的字符
StringBuilder result = new StringBuilder(); // 用于存储结果字符
for (char c : s.toCharArray()) {
if (!seen.contains(c)) {
seen.add(c); // 记录字符
result.append(c); // 添加到结果中
}
}
return result.toString(); // 返回结果字符串
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine(); // 读取输入
System.out.println(removeDuplicates(s)); // 输出结果
sc.close();
}
}
def remove_duplicates(s):
seen = set() # 用于记录已出现的字符
result = [] # 用于存储结果字符
for char in s:
if char not in seen:
seen.add(char) # 记录字符
result.append(char) # 添加到结果中
return ''.join(result) # 返回结果字符串
if __name__ == "__main__":
s = input().strip() # 读取输入
print(remove_duplicates(s)) # 输出结果
算法及复杂度
- 算法:字符串处理
- 时间复杂度:,其中 是字符串的长度。
- 空间复杂度:,用于存储已出现的字符。