给出了一个字符串列表,我们必须打印出唯一的字符串。唯一字符串是一个字符串,不会在字符串列表中重复。
Ex li = [ram,raj,ram,dev,dev]
unique string = raj.
我想到了一种算法。
首先对String数组进行排序,然后检查相邻字符串是否相等然后向前移动,否则为唯一字符串。 但是在这里,复杂度对于排序字符串数组非常高。
任何人都可以帮助我找到更高效的算法然后我的算法吗? 提前谢谢。
答案 0 :(得分:0)
你可以尝试下面的
List<String> names = Arrays.asList("ram", "raj", "ram", "dev", "dev");
Map<String, Long> nameCount = names.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()));
List<String> unique = nameCount.entrySet().stream().filter(e -> e.getValue() == 1L).map(Map.Entry::getKey).collect(Collectors.toList());
System.out.println(nameCount);
System.out.println(unique);
输出中
{dev=2, raj=1, ram=2}
[raj]
修改强>
List<String> uniq = new ArrayList<>();
names.stream().sorted().forEach(n -> {
if (uniq.contains(n)) {
uniq.remove(n);
} else {
uniq.add(n);
}
});
而不是列表映射cab用于检查包含在O(1)
中答案 1 :(得分:0)
您可以在O(n)复杂度中解决您的问题。
只需创建一个hash table来存储单词计数器,然后只访问带有count == 1
的单词
这个解决方案不是Liniar的时间,但仍然很好。
您可以使用count属性创建Trie,以便轻松找到count == 1
答案 2 :(得分:0)
你可以尝试这个简单的python实现,它基于使用 HashMap 的概念:
li = ['ram','raj','ram','dev','dev']
hash = dict()
for item in li:
if item in hash:
hash[item] += 1
else:
hash[item] = 1
print "unique string(s):",
for key, value in hash.iteritems():
if value == 1:
print key,