解题思路

这是一个字符串处理问题。需要遍历字符串并记录每个字符的出现情况,以便只保留第一次出现的字符。

关键点:

  1. 使用集合记录已经出现的字符。
  2. 遍历字符串,构建结果字符串。
  3. 保持字符的原始顺序。

算法步骤:

  1. 初始化一个空集合用于存储已出现的字符。
  2. 初始化一个空字符串用于存储结果。
  3. 遍历输入字符串的每个字符:
    • 如果字符不在集合中,则将其添加到结果字符串和集合中。
  4. 输出结果字符串。

代码

#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))  # 输出结果

算法及复杂度

  • 算法:字符串处理
  • 时间复杂度:,其中 是字符串的长度。
  • 空间复杂度:,用于存储已出现的字符。