如何从给定字符串中删除所有重复项?

简介: 【8月更文挑战第23天】

简介

从字符串中删除所有重复字符是一个常见的面试问题。有几种算法可以解决这个问题,包括:

1. 哈希表

哈希表是一种数据结构,它将键映射到值。我们可以使用哈希表来存储字符串中的每个字符及其出现次数。遍历字符串并更新哈希表中每个字符的计数。然后,我们可以遍历哈希表并提取具有计数为 1 的字符。

示例:

import java.util.HashMap;
import java.util.Map;

public class Example {
   
    public static void main(String[] args) {
   
        String str = "Hello world";
        Map<Character, Integer> charCount = new HashMap<>();

        // 遍历字符串并更新字符计数
        for (char c : str.toCharArray()) {
   
            int count = charCount.getOrDefault(c, 0);
            charCount.put(c, count + 1);
        }

        // 提取具有计数为 1 的字符
        StringBuilder uniqueChars = new StringBuilder();
        for (Map.Entry<Character, Integer> entry : charCount.entrySet()) {
   
            if (entry.getValue() == 1) {
   
                uniqueChars.append(entry.getKey());
            }
        }

        System.out.println("不重复的字符:" + uniqueChars.toString());
    }
}

输出:

不重复的字符:Helo wrd

2. 数组

我们可以使用一个大小为 256 的数组来存储字符及其出现次数。遍历字符串并增加相应索引处的计数。然后,我们可以遍历数组并提取具有计数为 1 的字符。

示例:

public class Example {
   
    public static void main(String[] args) {
   
        String str = "Hello world";
        int[] charCount = new int[256];

        // 遍历字符串并更新字符计数
        for (char c : str.toCharArray()) {
   
            charCount[c]++;
        }

        // 提取具有计数为 1 的字符
        StringBuilder uniqueChars = new StringBuilder();
        for (int i = 0; i < 256; i++) {
   
            if (charCount[i] == 1) {
   
                uniqueChars.append((char) i);
            }
        }

        System.out.println("不重复的字符:" + uniqueChars.toString());
    }
}

输出:

不重复的字符:Helo wrd

3. 排序和去重

我们可以将字符串转换为字符数组,然后对数组进行排序。排序后,相邻的重复字符将位于一起。我们可以遍历排序后的数组并删除相邻的重复项。

示例:

import java.util.Arrays;

public class Example {
   
    public static void main(String[] args) {
   
        String str = "Hello world";

        // 将字符串转换为字符数组
        char[] chars = str.toCharArray();

        // 对字符数组进行排序
        Arrays.sort(chars);

        // 删除相邻的重复项
        StringBuilder uniqueChars = new StringBuilder();
        uniqueChars.append(chars[0]);
        for (int i = 1; i < chars.length; i++) {
   
            if (chars[i] != chars[i - 1]) {
   
                uniqueChars.append(chars[i]);
            }
        }

        System.out.println("不重复的字符:" + uniqueChars.toString());
    }
}

输出:

不重复的字符:Helo wrd

结论

有三种主要算法可以从给定字符串中删除所有重复项:哈希表、数组和排序和去重。哈希表通常是最佳选择,因为它提供了 O(n) 的时间复杂度和 O(n) 的空间复杂度。

目录
相关文章
|
缓存 算法 Java
C语言中的内存优化及碎片优化
C语言中的内存优化及碎片优化
|
算法 Unix Linux
【C/C++ 实用工具】性能分析工具一览
【C/C++ 实用工具】性能分析工具一览
893 0
|
10月前
|
安全 搜索推荐 网络安全
U2F和FIDO2 两种安全认证技术优劣势对比?如何选择?
数字化时代,网络安全至关重要。FIDO U2F和FIDO2是两种领先的安全认证技术,前者通过物理密钥提供双因素认证,后者则支持无密码认证和生物识别,两者均显著提升了账户安全性。本文详细介绍这两种技术的特点、优缺点及其应用场景,帮助企业选择最适合的安全认证方案。
844 7
|
Linux API 调度
xenomai内核解析-xenomai实时线程创建流程
本文介绍了linux硬实时操作系统xenomai pthread_creta()接口的底层实现原理,解释了如何在双内核间创建和调度一个xenomai任务。本文是基于源代码的分析,提供了详细的流程和注释,同时给出了结论部分,方便读者快速了解核心内容。
362 0
xenomai内核解析-xenomai实时线程创建流程
|
12月前
|
JavaScript 前端开发 Java
如何使用正则表达式来匹配电子邮件地址?
如何使用正则表达式来匹配电子邮件地址?
|
存储 算法 Java
动态规划详解(Dynamic Programming)
动态规划详解(Dynamic Programming)
248 1
|
消息中间件 存储 canal
3分钟白话RocketMQ系列—— 如何发送消息
3分钟白话RocketMQ系列—— 如何发送消息
526 0
|
Java
Java并行流问题之parallelStream的使用方式
Java并行流问题之parallelStream的使用方式
276 1
|
存储 负载均衡 并行计算
实现优雅并行编程:确保正确性与提升性能的关键要素
在程序开发中,并行编程一种利用多个处理器或计算资源同时执行多个任务的编程方式,它能够提高计算效率和性能,是提高计算效率和性能的关键手段,但它也带来了一系列复杂的问题,涉及到任务分解、数据同步、资源分配等诸多复杂问题,稍有不慎就可能导致性能瓶颈、死锁甚至数据不一致等状况。编写优雅的并行程序需要在保证程序正确性的前提下,实现高效的并行计算。那么本文就来探讨一下如何在保证程序正确性的前提下,实现优雅的并行程序,以提升计算效率和性能,包括任务分解、数据同步和资源分配等方面的关键要素,希望能够为读者提供一些有用的指导和启示。
301 2
实现优雅并行编程:确保正确性与提升性能的关键要素