简介
从字符串中删除所有重复字符是一个常见的面试问题。有几种算法可以解决这个问题,包括:
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) 的空间复杂度。