人人都來寫算法 之 移除字符串中重複的字符,時間複雜度要求O(n),空間複雜度O(1)

移除字符串中重複的字符,不能使用額外的緩存空間。字符串支持所有的ASCII碼字符。

注意:  時間複雜度要求O(n),空間複雜度O(1),可以使用額外的一個或幾個變量,但不允許額外再開一個數組拷貝。

分析:
1. 時間複雜度爲O(n)條件下,最佳的方法就是採用包含256個位置尋址的哈希表來表示ASCII碼。但是條件中又限制只能使用幾個變量,因此採用bit尋址的方法可能是最接近要求的方法。
2. 因爲要求需要移除重複的字符,因此就需要在遍歷並判別是否是重複字符的同時,需要給字符串從下標0開始重新移位保存,最後一個字符之後採用'\0'結尾。

    
#include <iostream>

using std::cout;
using std::endl;

void removeDuplicate(char s[])
{
    int len = strlen(s);
    if(len < 2)
    {
        return;
    }

    int newIndex = 0;

    int check[8] = {0};
    for(int i=0; i<len; ++i)
    {
        int gap = (int)(s[i]);
        int index = gap / (sizeof(int)*8);
        int shift = gap % (sizeof(int)*8);
        
        if((check[index] & (1<<shift))==0)
        {
            s[newIndex] = s[i];
            newIndex++;

            check[index] |= (1<<shift);
        }
    }
    s[newIndex] = '\0';
}

void printStrArray(char s[])
{
    int len = strlen(s);
    for(int i=0; i<len; ++i)
    {
        cout<<s[i]<<" ";
    }
    cout<<"\n-------------------------------"<<endl;
}

int main()
{
    char s[] = "AaAbbccdg88dg&B%%&a*a*a";
    printStrArray(s);
    removeDuplicate(s);
    printStrArray(s);

    getchar();
}



發佈了96 篇原創文章 · 獲贊 26 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章