【问题标题】:How to find the non-repeating string from the list of string如何从字符串列表中找到不重复的字符串
【发布时间】:2017-02-22 00:27:37
【问题描述】:

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

Ex li = [ram,raj,ram,dev,dev]
unique string = raj. 

我想到了一种算法。

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

任何人都可以帮助我找到比我的算法更有效的算法吗? 提前致谢。

【问题讨论】:

  • 制作一个频率计数器(可能只是一个哈希图)来计算每个字符串的出现次数(线性时间)。然后只打印出那些具有单例计数的字符串(线性时间)
  • 感谢@inspectorG4dget。我明白了。
  • 从选择一种语言开始。
  • @shmosel 我使用 java 进行编码。我也在问题中标记了 python 和 c++,因为我想知道有效的算法而不是代码。如果我得到有效的算法,我可以用任何语言编写代码。这个问题也将发布在 python 和 c++ 社区中,我可以从不同的编码人员那里获得最佳解决方案。主要有竞争力的程序员用 C++ 编写代码。

标签: java python c++ string algorithm


【解决方案1】:

解决方案 1

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

只需创建一个hash table 来存储单词计数器,而不是仅使用count == 1 访问单词

解决方案 2

这个解决方案不是线性时间,但仍然是一个很好的解决方案。

您可以创建一个带有计数属性的Trie,这样可以很容易地找到带有count == 1的节点

【讨论】:

    【解决方案2】:

    你可以试试下面

        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) 中的包含

    【讨论】:

      【解决方案3】:

      你可以试试这个简单的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,
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-17
        • 2019-05-24
        • 2017-10-02
        • 1970-01-01
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多