字符串的非重复字符

时间:2011-07-16 13:28:24

标签: algorithm

给定一个字符串* Str的ASCII字符,写下伪代码以删除其中存在的重复元素。例如,如果给定的字符串是“Potato”,那么输出必须是“Pota”。附加约束是,算法必须就地。

我编写了一个包含255个元素的bool数组的程序,并将它们的值保持为false。在遍历字符串时,我将它们的值更改为true以将它们标记为已访问,并且以这种方式我有另一个唯一值的字符串。这样我就可以使用恒定的空间。有没有更好的方法可以做到这一点。请指出。

4 个答案:

答案 0 :(得分:3)

你使用了“另一个字符串”,所以也许,也许,你有两个字符串?就地的想法是你用同一个字符串来做。但也许你只是意味着“另一个字符串内容”,所以是的,那就没关系了。为了澄清:你有给出的字符串,并指定两个指向它的开头的指针,然后推动你的读者指针一次读取一个字符,写入(并因此递增你的编写器指针)只有当char尚未存在时你的255桌。

答案 1 :(得分:2)

你需要一个布尔数组字母大小(例如26为小写拉丁字母)。然后遍历字符串,并为每个字母检查数组的相应字段是否为真。如果不是,请将其设置为true。然后删除这封信。要删除这些字母,请保留一个已经删除了多少字母的计数器,并将每个字母复制到左侧。因为这听起来像是家庭作业,所以我将伪代码的写作留给你。

答案 2 :(得分:0)

为了使你的解决方案到位,而不是使用输出数组,只要你想删除一个字符,只需将输入数组中的下一个字符向左移动到当前位置。

伪代码:

for each position in input_array:
     c=input_array[position]
     if we have already seen c
         shift left all characters position+1 by one character.
         position=position-1 // so that we process this character in the next iteration
     else
         mark c as seen
     end if

答案 3 :(得分:0)

这是一些伪代码:

seen is array of 256 boolean, initially all false
output position is start of string
for each position in string:
    c is char at position
    if seen[c] is false:
        set seen[c] to true
        set char at output position to c
        increment output position

输出字符串以output position结束。不要忘记设置输出字符串的长度或根据需要添加其终止符(取决于编程语言)。