各種面試題 字串匹配查詢

2021-06-18 10:11:18 字數 1274 閱讀 3668

傳聞是fb 2012的題,真不是蓋的啊。

有乙個長度為n的字串str,有非常多的關鍵字query(長度不超過10),需要判斷每個關鍵字是否是str的子串。

注意:query是動態的輸入進行查詢的,預先並不知道所有的query。

請實現2個函式initwithstring(str)existsubstring(query)。我們會首先呼叫一次initwithstring(str),你可以在這個函式中做一些預處理操作。然後對於每乙個query,函式existsubstring(query)需要返回這個query是否為str的子串。

有乙個很重要的點是注意從query長度不超過10能挖掘出什麼來。

預處理肯定是要建立字尾陣列的了,然後排序,之後就可以拿query串到排序陣列裡去找是否是某個串的字首,如果是的話就返回true了。

這樣做是可解的了,主要是注意sort時候要給乙個比較函式,不然就拿char*的位址來比較了。

但是很容易發現源串的長度會非常大,比如1000000,這樣建立字尾陣列後,排序的時間會非常的長,我們需要從query串長度很小這裡來優化一下這個排序,既然query與字尾陣列中的串最多也就比較10次,那麼字尾陣列中的兩個字尾大於10的長度之後的字元的關係其實是沒有意義的,所以排序的時候,比較兩個串只用看前10個的關係,這樣排序的效率就提公升了很多,也就不會超時了。

#includeusing namespace std;

vectorprefix;

bool compare(char* s, char* q)

if ( n==0 )

return true;

else

return *s=='\0';

}int startwith(char* src,char* query);

// 預處理初始化

void initwithstring(char *str)

// 如果query是str的字串,返回true,否則返回false

bool existsubstring(char *query)

return false;

}int startwith(char* src,char* query)

while(*src!='\0' && *query!='\0')

if ( *query=='\0' )

return 0;

else

return -1;

}

面試題 字串翻轉

使用 c c 編寫函式,實現字串反轉,要求不使用任何系統函式,且時間複雜度最小,函式原型 char reverse str char str 使用c c 編寫函式,實現字串反轉,要求不使用任何系統函式,且時間複雜度最小,函式原型 char reverse str char str include i...

字串面試題 字串逆序

字串逆序可以說是最經常考的題目。這是一道入門級的題目。給定乙個字串s,將s中的字元順序顛倒過來,比如s abcd 逆序後變成s dcba 基本上沒有這麼考的,放在這裡主要是為了和後面的原地逆序做個對比。很簡單,直接分配乙個與原字串等長的字元陣列,然後反向拷貝一下即可。char reverse cha...

面試題 字串轉位元組

這是遇到的面試題,請問i j 為什麼?string str1 abcd測試一下 var strtobytes1 system.text.encoding.utf8.getbytes str1 var i strtobytes1.length var j str1.length 答 i 16 j 8 ...