按顺序输出字符串中的唯一字符

来源:互联网 发布:泸州市网络问政 编辑:程序博客网 时间:2024/06/04 00:43

例子:

input: "Hello world";output: "Hewrd";input: "Microsoft Google Oracle";output: "MisftGgOa";

方法一:双层循环,时间复杂度O(n2)

这种方法好理解,两层循环做嵌套,对字符串中的每个字符逐个比较,这种方法简单是简单,但是时间复杂度相对较高。

方法二:两次循环,时间复杂度O(n)

这种方法主要思路是对字符串中的字符进行计数统计,比如做一个长度为52(大小写字母共52个)的整型数组。数组的下标可以根据字符的ASCII码确定,数组本身存储字符出现的次数。

统计完了,然后再遍历一遍原字符串(因为人家要原始顺序),次数为1的弄出来,大于1的,略过。

这就是遍历两次,但最终时间复杂度仍为O(n)

方法三:时间复杂度O(n),但只用一次循环。

建立两个数组count[]index[],大小都是256。其中count[]还是做字符计数的,index[]则是做索引的。

想法大致是这样,首先还是依次遍历字符串中的字符,并在count[]中做计数,如果count[i]=1,那么index[i]就记录下该字符在元字符串中出现的位置。如果count[i]=2,那么就将index[i]移除。

最后呢对index[i]所指示的下标从小到大做输出就行了,注意,因为index的大小是确定的,所以这一步的时间复杂度是O(1)

代码实现如下:

#include <iostream>using namespace std;const int MAX_CHAR = 256;void printDistinct(string str){    int n = str.length();    int count[MAX_CHAR];    int index[MAX_CHAR];    for (int i = 0; i < MAX_CHAR; i++)    {        count[i] = 0;        index[i] = n;    }    for (int i = 0; i < n; i++)    {        char x = str[i];        ++count[x];        if (count[x] == 1 && x != ' ')            index[x] = i;        if (count[x] == 2)            index[x] = n;    }    sort(index, index + MAX_CHAR);    for (int i = 0; i < MAX_CHAR && index[i] != n; i++)        cout << str[index[i]];}int main(){    string str = "Microsoft Google Oracle";    printDistinct(str);    return 0;}
原创粉丝点击