【问题标题】:Removing repeated characters in string without using recursion在不使用递归的情况下删除字符串中的重复字符
【发布时间】:2011-10-20 14:41:13
【问题描述】:

给你一个字符串。开发一个函数来删除该字符串中的重复字符。字符串可以是任意长度。你的算法必须在太空中。如果您希望可以使用不依赖于字符串大小的恒定大小的额外空间。您的算法必须具有 O(n) 的复杂度。

我的想法是定义一个大小为 26 的整数数组,其中第 0 个索引对应于字母 a,第 25 个索引对应于字母 z,并将所有元素初始化为 0。 因此,我们将遍历整个字符串一次,并在遇到字母时增加所需索引处的值。

然后我们将再次遍历字符串,如果所需索引处的值为 1,我们打印出该字母,否则我们不打印。

这样时间复杂度为 O(n) 并且使用的空间是恒定的,与字符串的长度无关!!

如果有人能提出提高效率的想法,那将非常有帮助!

【问题讨论】:

  • 猜这是一个家庭作业:P 任何编程语言限制?或伪代码是好的?例如,如果它是 PHP,您可以附加到一个数组并且大小将是可变的,最多只能使用您旅行过的字符数,并且检查一个字符是否已被检查是一个 in_array 的问题(例如)跨度>
  • 我认为假设字符串仅包含 az 是不公平的。 Unicode 中有超过一百万个代码点。
  • @purefan 这不是一个家庭作业问题,因为您已经看到我已将其标记为面试 qs..
  • @Ray Toal Ya 如果你能想出一个更好的解决方案,它将包含所有代码点,我将不胜感激
  • 好的,我试一试,但首先,重复是什么意思?您是指在字符串中的任何位置多次出现的任何字符,还是两次或多次出现相同字符的任何连续运行。后者是 Unix uniq 程序中删除的内容。

标签: string complexity-theory


【解决方案1】:

您的解决方案绝对符合 O(n) 时间的标准。如果允许的字母很大(Unicode 有超过一百万个字符),那么数组会非常非常大,而不是使用普通哈希。这是您在(未优化!)Ruby 中的算法:

def undup(s) 
  seen = Hash.new(0)
  s.each_char {|c| seen[c] += 1}
  result = ""
  s.each_char {|c| result << c if seen[c] == 1}
  result
end

puts(undup "")
puts(undup "abc")
puts(undup "Olé")
puts(undup "asdasjhdfasjhdfasbfdasdfaghsfdahgsdfahgsdfhgt")

它通过字符串两次,并且由于哈希查找不是线性的,所以你很好。

您可以说 Hashtable(就像您的数组一样)使用常量空间,尽管它很大,因为它受字母表大小的限制。即使字母的大小大于字符串的大小,它仍然算作常数空间。

这个问题有很多变体,其中很多都很有趣。要做到真正到位,可以先排序;这给出了 O(n log n)。合并排序有一些变化,您在合并期间忽略重复。事实上,这种“没有外部哈希表”的限制出现在Algorithm: efficient way to remove duplicate integers from an array(也标记了面试问题)中。

另一个常见的面试问题是从一个简单的字符串开始,然后他们说,好吧,现在是一百万个字符的字符串,好吧,现在是一千亿个字符的字符串,等等。当您开始考虑大数据时,事情会变得非常有趣。

不管怎样,你的想法很不错。它通常可以进行如下调整:使用集合,而不是字典。穿过绳子。对于每个字符,如果它不在集合中,则添加它。如果是,删除它。 set占用空间少,不需要计数器,如果字母表很小,可以实现为bitset,而且这种算法不需要两次pass。

Python 实现:http://code.activestate.com/recipes/52560-remove-duplicates-from-a-sequence/

【讨论】:

    【解决方案2】:

    您还可以使用位集而不是附加数组来跟踪找到的字符。根据允许的字符(a-z 或更多),您可以相应地调整位集的大小。这比整数数组需要更少的空间。

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多