閱讀147 返回首頁    go 阿裏雲 go 技術社區[雲棲]


CareerCup之1.1字符串中字符判重

【題目】

Chapter 1 | Arrays and Strings

原文:

1.1 Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?

譯文:

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

【分析】

【思路一】首先,我們要搞清楚構成字符串的字符個數到底有多大?是ASCII字符,還是隻是26個字母? 還是有更大的字符個數,對於不同的情況,我們可能會有不同的解決方案。如果我們假設字符集是ASCII字符,那麼我們可以開一個大小為256的bool數組來表征每個字 符的出現。數組初始化為false,遍曆一遍字符串中的字符,當bool數組對應位置的值為真, 表明該字符在之前已經出現過,即可得出該字符串中有重複字符。否則將該位置的bool數組 值置為true。

該算法的時間複雜度為O(n)。

【思路二】

我們還可以通過位運算來減少空間的使用量。其實就是用所謂的Bit-map的原理來存儲。就是用一個bit位來標記某個元素對應的Value,在這就是該元素是否出現的bool值,而Key即是該元素。用每一位表征相應位置字符是否出現。對於ASCII字符,我們需要256位,即一個長度為8的int數組map即可(8*4*8)。
這裏的關鍵是要把字符對應的ASCII,映射到正確的位上去。
舉個例子:
字符'a'對應的ASCII是97,那麼我們應該將數組中的哪一位置為1呢?
用97除以32,得到對應數組map的下標:3。97對32取模得到相應的位:1。

【代碼】

/*********************************
*   日期:2014-05-04
*   作者:SJF0115
*   題目: 字符串中字符判重
*   來源:CareerCup
**********************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

bool IsUnique(string str){
    bool visited[256];
    //初始化
    memset(visited,false,sizeof(visited));
    int len = str.length();
    for(int i = 0;i < len;i++){
        int index = (int)str[i];
        //判斷是否有重複
        if(!visited[index]){
            visited[index] = true;
        }
        else{
            //有重複直接返回
            return true;
        }
    }
    return false;
}

int main(){
    string str = "i am xiaosi";
    bool result = IsUnique(str);
    cout<<result<<endl;
    return 0;
}

【代碼2】

/*********************************
*   日期:2014-05-04
*   作者:SJF0115
*   題目: 字符串中字符判重
*   來源:CareerCup
**********************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

//判斷字符串中字符是否重複
bool IsUnique(string str){
    //8*4*8 共256位可以表示256個元素
    int map[8];
    //初始化
    memset(map,0,sizeof(map));
    int len = str.length();
    for(int i = 0;i < len;i++){
        int value = (int)str[i];
        int index = value / 32, offset = value % 32;
        //判斷是否已經存儲過
        if(map[index] & (1 << offset)) {
            //重複
            return false;
        }
        map[index] |= (1 << offset);
    }
    return true;
}

int main(){
    string str = "i amxos ";
    bool result = IsUnique(str);
    cout<<result<<endl;
    return 0;
}




最後更新:2017-04-03 12:56:30

  上一篇:go 深入探討Box2D中ghost collision問題解決方案
  下一篇:go 經典白話算法之中綴表達式和後綴表達式