傳聞是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 ...