删除重复字符

时间:2017-07-14 11:21:29

标签: arrays string algorithm data-structures

我面临的问题是:

  

给定一个仅包含小写字母的字符串,删除重复的字母,以便每个字母只出现一次。您必须确保结果是所有可能结果中的smallest in lexicographical顺序。

示例
鉴于“bcabc”
返回“abc”

鉴于“cbacdcbc”
返回“acdb”

我想到了一些方法,但仍然无法解决问题。问题的链接是leetcode

我不想在解决方案中使用任何代码,但我可以采取的方法来解决问题。提前致谢。

更新:将添加我采用的方法(顺便说一下这是错误的/不完整的)

  

将在某些数据结构中保存字符串中每个字符的最后位置。之后将开始按其最后位置的升序处理字符。例如:在第一次迭代中,处理具有最小最后位置的字符。我想我将遍历字符串,直到我处理的角色的最后位置,并在某些条件下删除几个字符(例如,如果循环中的字符小于具有最小位置的字符,而其他只是相同但大于它)。但都只是失败了。

3 个答案:

答案 0 :(得分:1)

算法

你的方法听起来几乎就在那里。

第一步听起来不错:

  

在某些数据结构中保存字符串中每个字符的最后位置。之后将开始按其最后位置的升序处理字符。

     

在第一次迭代中,处理具有最小最后位置的字符。

在你的例子" cbacdcbc"中,最小的最后位置是3,即a的位置。

字符串的第一个字母将等于前3个位置中的最小字符(在本例中为字母a)。

现在,您可以从刚刚选择的字母后面的字母开始重复此过程。所以在这种情况下" cdcbc"。唯一的区别是,您现在可以忽略您选择的任何字母的最后位置,因为您不能再次选择这些字母。

说明

考虑选择输出的第一个字母。我们想知道它可以是最小的。为了使它变小,我们需要在字符串中删除它之前的字符,但如果它是最后一次出现,我们不能删除它(因为这将使得不可能满足约束)。

因此我们知道我们可以安全地删除最小最后位置的字符,并且我们希望知道输出的第一个字符的最小值是多少,因此我们应该选择允许范围内的最小字符。 (如果有多个最小的,那么最早选择。)

答案 1 :(得分:0)

您可以根据您使用的语言使用Set类型。 像SortedSet这样的东西可能会解决你的问题

答案 2 :(得分:0)

您好,您可以使用哈希表

让我们说这是字符串" cbacdcbc"

创建一个长度为26的数组,填充数组中的全部0。 现在迭代throght字符串并将每个字符放在数组的索引值为字符ascii值,排序数组,你完成了问题。

说int a [26];

这里的[' c'] = val;