我面临的问题是:
给定一个仅包含小写字母的字符串,删除重复的字母,以便每个字母只出现一次。您必须确保结果是所有可能结果中的
smallest in lexicographical
顺序。
示例
鉴于“bcabc”
返回“abc”
鉴于“cbacdcbc”
返回“acdb”
我想到了一些方法,但仍然无法解决问题。问题的链接是leetcode
我不想在解决方案中使用任何代码,但我可以采取的方法来解决问题。提前致谢。
更新:将添加我采用的方法(顺便说一下这是错误的/不完整的)
将在某些数据结构中保存字符串中每个字符的最后位置。之后将开始按其最后位置的升序处理字符。例如:在第一次迭代中,处理具有最小最后位置的字符。我想我将遍历字符串,直到我处理的角色的最后位置,并在某些条件下删除几个字符(例如,如果循环中的字符小于具有最小位置的字符,而其他只是相同但大于它)。但都只是失败了。
答案 0 :(得分:1)
你的方法听起来几乎就在那里。
第一步听起来不错:
在某些数据结构中保存字符串中每个字符的最后位置。之后将开始按其最后位置的升序处理字符。
在第一次迭代中,处理具有最小最后位置的字符。
在你的例子" cbacdcbc"中,最小的最后位置是3,即a的位置。
字符串的第一个字母将等于前3个位置中的最小字符(在本例中为字母a)。
现在,您可以从刚刚选择的字母后面的字母开始重复此过程。所以在这种情况下" cdcbc"。唯一的区别是,您现在可以忽略您选择的任何字母的最后位置,因为您不能再次选择这些字母。
考虑选择输出的第一个字母。我们想知道它可以是最小的。为了使它变小,我们需要在字符串中删除它之前的字符,但如果它是最后一次出现,我们不能删除它(因为这将使得不可能满足约束)。
因此我们知道我们可以安全地删除最小最后位置的字符,并且我们希望知道输出的第一个字符的最小值是多少,因此我们应该选择允许范围内的最小字符。 (如果有多个最小的,那么最早选择。)
答案 1 :(得分:0)
您可以根据您使用的语言使用Set类型。 像SortedSet这样的东西可能会解决你的问题
答案 2 :(得分:0)
您好,您可以使用哈希表
让我们说这是字符串" cbacdcbc"
创建一个长度为26的数组,填充数组中的全部0。 现在迭代throght字符串并将每个字符放在数组的索引值为字符ascii值,排序数组,你完成了问题。
说int a [26];
这里的[' c'] = val;