字串面試題的特點:
1.廣泛性
(1)字串可以看做字元型別的陣列,與陣列排序、查詢、調整有關
(2)很多其他型別的面試題可以看做字串型別的面試題
2.需要掌握的概念
(1)回文
(2)子串(連續)
(3)子串行(不連續)
(4)字首樹(trie樹)
(5)字尾樹和字尾陣列
(6)匹配
(7)字典序
3.需掌握的操作:
(1)與陣列相關的操作:增刪改查
(2)字元的替換
(3)字串的旋轉
字串題目的常見型別
1.規則判斷:
(1)判斷字串是否符合整數規則
(2)判斷字串是否符合浮點數規則
(3)判斷字串是否符合回文字串規則
2.數字運算
int和long型別表達範圍有限,所以經常用字串實現大整數
與大整數相關的加減乘除操作,需要模擬筆算的過程
3.與陣列操作有關的型別
(1)陣列相關的調整,排序等操作需要掌握
(2)快速排序的劃分過程需要掌握和改寫
4.字元計數
(1)雜湊表
(2)固定長度的陣列
(3)滑動視窗問題、尋找無重複字元子串問題,計算變位詞問題
5.動態規劃問題
(1)最長公共子串
(2)最長公共子串行
(3)最長回文子串
(4)最長回文子串行
6.搜尋型別
(1)寬度優先搜尋
(2)廣度優先搜尋
7.高階演算法與資料結構解決的問題
(1)manacher演算法解決最長回文子串問題
(2)kmp演算法解決字串匹配問題
(3)字首樹問題
(4)字尾樹和字尾陣列
(5)通常面試中很少出現
拓撲結構相同子樹練習題
兩種方法:
方法1:
對於t1的每棵子樹,都去判斷是否與t2樹的拓撲結構完全一樣,這個過程的實踐複雜度是o(m),t1的子樹共有n棵,所以時間複雜度為o(m*n)
方法2:
首先把t1樹和t2樹按照先序遍歷的方式序列化,之後用kmp演算法去判斷t2str是否是t1str的子串即可。t1的序列化的過程是o(n),t2的序列化是o(m),kmp演算法解決匹配問題的複雜度是o(m+n),所以總體時間複雜度是o(m+n)
詞語變形練習題
兩個字串str1和str2,如果str1和str2中出現的字元種類一樣,且每種字元出現的次數一樣,那麼str1和str2互為變形詞。
給定兩個字串以及他們的長度,請設計乙個函式,返回乙個bool值,代表他們是否互為變形詞
測試用例:
str1=『123』,str2=』231』,返回true
str1=』123』,str2=』2331』,返回false
解題思路:
使用固定長度的陣列來存放每個字串裡面出現的次數,
對每個串進行計數,最後再比較是否相同
class
solution:
defchktransform
(self,a,lena,b,lenb):
dicta = self.countdict(a,lena)
dictb = self.countdict(b,lenb)
return dicta == dictb
defcountdict
(self,a,lena):
dicta = {}
for i in range(lena):
if a[i] not
in dicta:
dicta[a[i]] = 0
dicta[a[i]] += 1
print(dicta)
return dicta
test = solution()
a = '12314'
b = '231522'
lena = len(a)
lenb = len(b)
print(test.chktransform(a,lena,b,lenb))
直通BAT面試演算法精講 字串(3)
空格替換練習題 題幹 給定乙個字串str,將其中所有的空格字元替換成 20 假設str後面有足夠的空間 一般思路 1 遍歷發現空格數量,計算替換後的總長度 2 從右往左依次拷貝字元,遇到空格換為 20 即可。python 可以使用 replace 函式 class solution def repl...
直通BAT面試演算法精講 排序(1)
注 所有的 都是用python實現的,都是自己寫的,可能有些地方不太完善 時間複雜度 o n 2 空間複雜度 o 1 思想 依次訪問元素,逆序就置換。一趟排序後最大 小 的被置換到最後 def bubble sort arr,n ifnot arr return none for i in rang...
直通BAT面試演算法精講 鍊錶(1)
鍊錶問題知識點和注意事項 1.鍊錶問題演算法難度不高,但考察 實現能力。2.鍊錶和陣列都是一種線性結構,陣列是一段連續的儲存空間,鍊錶空間不一定保證連續,是臨時分配的 鍊錶問題 實現關鍵點 1.鍊錶調整函式的返回值,型別要求往往是節點型別。2.處理鍊錶過程中,先採用畫圖的方式理清邏輯。3.鍊錶問題對...