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

简介: 【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) 的空间复杂度。

目录
相关文章
|
4月前
|
Java C++ Python
leetcode-1047:删除字符串中的所有相邻重复项
leetcode-1047:删除字符串中的所有相邻重复项
37 0
|
11月前
|
存储 算法 前端开发
前端算法-删除字符串中的所有相邻重复项
前端算法-删除字符串中的所有相邻重复项
|
1月前
|
算法 Java
LeetCode第28题找出字符串中第一个匹配项的下标
这篇文章介绍了LeetCode第28题"找出字符串中第一个匹配项的下标"的两种解法:暴力解法和KMP算法,并解释了KMP算法通过构建前缀表来提高字符串搜索的效率。
LeetCode第28题找出字符串中第一个匹配项的下标
|
4月前
|
存储 Java 索引
删除字符串中的所有相邻重复项
删除字符串中的所有相邻重复项
|
4月前
leetcode代码记录(删除字符串中的所有相邻重复项
leetcode代码记录(删除字符串中的所有相邻重复项
28 0
|
11月前
【Leetcode -844.比较含退格的字符串 -1047.删除字符串中的所有相邻重复项】
【Leetcode -844.比较含退格的字符串 -1047.删除字符串中的所有相邻重复项】
46 0
⌈力扣⌋删除字符串中的所有相邻重复项
⌈力扣⌋删除字符串中的所有相邻重复项
46 0
删除排序数组中的重复项
删除排序数组中的重复项 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。 将最终结果插入 nums 的前 k 个位置后返回 k 。
68 0
|
算法
LeetCode每日1题--删除字符串中的所有相邻重复项
LeetCode每日1题--删除字符串中的所有相邻重复项
65 0
|
算法
LeetCode:28. 找出字符串中第一个匹配项的下标
题目描述:给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。