判斷一個字符串中的字符是否唯一(面試題1)


參考地址:http://www.cricode.com/254.html

實現一個算法來判斷一個字符串中的字符是否唯一(即沒有重復).不能使用額外的數據結構。 (即只使用基本的數據結構)

解答

首先,你可以問面試官,構成字符串的字符集有多大?是ASCII字符,還是只是26個字母? 還是有更大的字符集,對於不同的情況,我們可能會有不同的解決方案。

如果我們假設字符集是ASCII字符,那么我們可以開一個大小為256的bool數組來表征每個字 符的出現。數組初始化為false,遍歷一遍字符串中的字符,當bool數組對應位置的值為真, 表明該字符在之前已經出現過,即可得出該字符串中有重復字符。否則將該位置的bool數組 值置為true。

該算法的時間復雜度為O(n)。我們還可以通過位運算來減少空間的使用量。 用每一位表征相應位置字符的出現。對於ASCII字符,我們需要256位,即一個長度為8的int 數組a即可。這里的關鍵是要把字符對應的數字,映射到正確的位上去。比如字符’b’對應的 代碼是98,那么我們應該將數組中的哪一位置為1呢?用98除以32,得到對應數組a的下標: 3。98對32取模得到相應的位:2。

代碼截圖如下:

如果字符集只是a-z(或是A-Z),那就更好辦了,用位運算只需要一個整型數即可。

完整代碼如下:

/*===============================================
# Author: RollerCoaster
# Last modified:2014-09-09 12:14
# Filename: 01判斷一個字符串中的字符是否唯一.c
# Description:這個題目的願意為判斷一個字符串中的每一個字符是否唯一。
=================================================*/

#include<iostream>
#include<string>
using namespace std;

// 功能:判斷一個字符串中的每個字符是否唯一
// 入參:s 字符串
// 返回:是否唯一
bool isUnique1(string s)
{ 
    bool a[256];
    memset(a, 0, sizeof(a));
    int len = s.length();
    for(int i = 0; i < len; i++)
    {
        int v = (int)s[i];
        if (a[v])
        {
            // 該字符已經出現過,所以不唯一
            return false;
        }
        a[v] = true;
    }

    return true;
}

// 功能:判斷一個字符串中的字符是否唯一,使用位操作節省空間
// 輸入:s 字符串
// 返回:是否唯一
bool isUnique2(string s)
{
    int a[8];
    memset(a, 0, sizeof(a));
    int len = s.length();
    for(int i = 0; i < len; i++)
    {
        int v = (int)s[i];
        int index = v / 32;
        int pos = v % 32;
        if (a[index] & (1 << pos))
        {
            return false;
        }

        a[index] |= (1 << pos);
    }

    return true;
}



// 功能:判斷字符串a - z 或是(A—Z)中字符是否唯一。
// 參數:s 字符串
// 返回:是否唯一
bool isUnique3(string s)
{
    int check = 0;
    int len = s.length();
    for(int i = 0; i < len; i++)
    {
        int v = s[i] - 'a';
        if (check & (1 << v))
        {
            return false;
        }

        check |= (1 << v);
    }

    return true;
}

int main()
{
    string s1;
    while(cin>>s1)
    {
        cout << isUnique1(s1) << endl;
        cout << isUnique2(s1) << endl;
        cout << isUnique3(s1) << endl;
    }

    return 0;
}

 


免責聲明!

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



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