如何从字符串列表中查找非重复字符串

时间:2016-10-13 02:55:45

标签: java python c++ string algorithm

给出了一个字符串列表,我们必须打印出唯一的字符串。唯一字符串是一个字符串,不会在字符串列表中重复。

Ex li = [ram,raj,ram,dev,dev]
unique string = raj. 
我想到了一种算法。

首先对String数组进行排序,然后检查相邻字符串是否相等然后向前移动,否则为唯一字符串。 但是在这里,复杂度对于排序字符串数组非常高。

任何人都可以帮助我找到更高效的算法然后我的算法吗? 提前谢谢。

3 个答案:

答案 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)

解决方案1 ​​

您可以在O(n)复杂度中解决您的问题。

只需创建一个hash table来存储单词计数器,然后只访问带有count == 1的单词

解决方案2

这个解决方案不是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,