面試題10:去除字符串中的重復字符


題目描述:

設計算法並寫出代碼移除字符串中重復的字符,不能使用額外的緩存空間。注意:可以使用額外的一個或兩個變量,但不允許額外再開一個數組拷貝。進一步地,為你的程序寫測試用例。

解題思路:

這道題目其實是要你就地(in place)將字符串中重復字符移除。你可以向面試官問清楚,不能使用額外的一份數組拷貝是指根本就不允許開一個數組,還是說可以開一個固定大小,與問題規模(即字符串長度)無關的數組。

如果根本就不允許你再開一個數組,只能用額外的一到兩個變量。那么,你可以依次訪問這個數組的每個元素,每訪問一個,就將該元素到字符串結尾的元素中相同的元素去掉( 比如置為’’),時間復雜度為O(n2 )。

string removeDuplicate2(string s)
{
    int len = s.length();
    if(len < 2) 
        return s;
    string str = "";
    for(int i=0; i<len; ++i)
    {
        if(s[i] != ' ')
        {
            str += s[i];
            for(int j=i+1; j<len; ++j)
            {
                if(s[j]==s[i])
                {
                    s[j] = ' ';
                }                                            
            }
        }
    }
    return str;
}

測試用例:

  1. 不包含重復字符的字符串,比如:abcd
  2. 字符串全是重復字符,比如:aaaa
  3. 空字符串
  4. 重復字符連續出現,比如:aaabbb
  5. 重復字符不連續出現,比如:abababa
int main()
{
    string s1 = "abcde";
    string s2 = "aaabbb";
    string s3 = "";
    string s4 = "abababc";
    string s5 = "ccccc";

    cout<<removeDuplicate2(s1)<<endl;
    cout<<removeDuplicate2(s2)<<endl;
    cout<<removeDuplicate2(s3)<<endl;
    cout<<removeDuplicate2(s4)<<endl;
    cout<<removeDuplicate2(s5)<<endl;
 
    return 0;
}

測試結果:

abcde
ab

abc


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM