我假设删除重复项意味着结果最多包含一次出现的任何字符。(其他一些答案假设只需将相邻的重复项减少到单次出现。)基本算法是:
- 将结果初始化为空字符串
- 循环遍历输入的每个字符,如果该字符尚未出现在结果中,则将其附加到结果中
- 返回结果
一个天真的(并且非常低效)的实现将是:
private String removeAnyDuplicates(String userWord)
{
String result = "";
for (int i = 0; i < userWord.length(); ++i) {
char c = result.charAt(i);
if (result.indexOf(c) < 0) {
// negative index indicates not present
result += String.valueOf(c);
}
}
return result;
}
这有两个主要的低效率来源:它创建了许多中间String
对象,并且它必须扫描迄今为止输入的每个字符的整个结果。这些问题可以通过使用其他一些内置的 Java 类来解决——一个StringBuilder
更有效地累积结果和一个Set
实现来有效地记录和测试哪些字符已经被看到:
private String removeAnyDuplicates(String userWord)
{
int len = userWord.length();
StringBuilder result = new StringBuilder(len);
Set<Character> unique = new HashSet<Character>();
for (int i = 0; i < len; ++i) {
char c = result.charAt(i);
// try to add c to set of unique characters
if (unique.add(c)) {
// if it succeeds, this is the first time seeing c
result.append(c);
}
}
return result.toString();
}