為了準備面試中出現的字串問題,我決定做乙個系列,以我自己的標準,將自己認為比較優秀的字串面試題整理一些。希望這樣做能夠形成解決字串問題的一般思路,能夠比較高效地解決字串問題。
這個問題是看了 感謝@v_july_v)。
問題描述:有兩個任意字串sting a, sting b, 實現如下函式 int contain( string &a, sting &b),如果a 裡面包含b所有出現的字元,函式返回true,其它情況返回false。相當於集合上的包含問題。
@v_july_v提供了大致四種思路:輪訓,排序輪訓,素數相乘,及利用hash查詢的思想(包括)。
採用hash查詢思想的思路這樣的:
step1:先分配乙個整數陣列hash[max],陣列大小為字符集個數(ascii碼為256),並初始化為0。
step2:然後開始遍歷stirng a,然後將整形陣列中位置為這些字元的ascii值的元素增1;比如出現『a』,的ascii為65,那麼hash[65]++;
step3:遍歷stingb,如果陣列裡面那些位置為sringb字符集裡的ascii值的元素都不為0,則字串a包含字串b,
**實現:
int contain(const char *stra, const char *strb)
; const char *p = stra;
while( *p != '\0')
p = strb;
while( *p != '\0')
return 0;// succeed!
}
這個思路可以改進為:用位元位來表示stringa裡字元的出現。具體**參見@v_july_v相應的**。不過他把問題進行了簡化,字符集僅限於大寫字母,故只需要乙個整數,就可以表示所有的字元出現標誌,其實只要26個。但是字符集擴大的話,比如128,256,這就無法用乙個int或者long來表示了。可以用結構體來實現。
typedef struct
hash;
int move(hash *h,char a)//
int hashflag(hash *h, char c)
int strcontain(const char *stra, const char *strb)
return 0;
}
面試題 字串移位包含問題
問題描述挺簡單的,就是給兩個字串,判斷乙個是否可以被另乙個迴圈移位 定義 向右迴圈移位 得到的字串 包含 也可為本身,也可為子串 解法一我們可以先直接進行字串的移位工作,在進行字串包含的判斷,從而遍歷器所有的可能性 但是這個方法比較浪費,因為要遍歷所有的可能性並且要進行字串的移位,並且在移位的過程中...
字串面試題 字串逆序
字串逆序可以說是最經常考的題目。這是一道入門級的題目。給定乙個字串s,將s中的字元順序顛倒過來,比如s abcd 逆序後變成s dcba 基本上沒有這麼考的,放在這裡主要是為了和後面的原地逆序做個對比。很簡單,直接分配乙個與原字串等長的字元陣列,然後反向拷貝一下即可。char reverse cha...
面試題 字串翻轉
使用 c c 編寫函式,實現字串反轉,要求不使用任何系統函式,且時間複雜度最小,函式原型 char reverse str char str 使用c c 編寫函式,實現字串反轉,要求不使用任何系統函式,且時間複雜度最小,函式原型 char reverse str char str include i...