換句話說,第乙個字串的排列之一是第二個字串的子串。
示例1:
輸入: s1 = "ab" s2 = "eidbaooo"輸出: true
解釋: s2 包含 s1 的排列之一 ("ba").
示例2:
輸入: s1= "ab" s2 = "eidboaoo"輸出: false
注意:輸入的字串只包含小寫字母
兩個字串的長度都在 [1, 10,000] 之間
解題思路:
解決這個問題前可以先回顧下無排列的子串匹配問題,我們當時使用的是實現了dfa狀態轉移圖,當匹配到不同字元時來到不同的狀態,知道最終完全匹配。
(圖後補,下次一定)
而對於有排列的子串問題,我們一樣可以構建乙個dfa圖來實現它,在這時候相比於無排列子串匹配問題,子串的字元順序就不重要了,思路如下:
(圖後補,下次一定)
逐個判斷長字串字元:
(1)不是子串字元,跳過
(2)是子串字元且沒多餘重複,記錄當前匹配到的長度
(3)是子串字元但是已經多餘了,比如子串「adc」,串「dcda「,第二個d是超出了子串d個數的,從第二個d這個位置往前重新匹配到dc。
(4)若匹配到的個數已經達到子串長度,完成。
classsolution
return
false
; }
int size[26];//
子串字元統計
int size_tmp[26];//
臨時子串已用字元統計
memset(size,0,sizeof(int)*26
); memset(size_tmp,
0,sizeof(int)*26
);
mapmp;
for(int i=0;i)
int len=0
;
for(int i=0;i)
//是子串字元,判斷是否多餘出現
//couta']'
a'])
else
if(size_tmp[s2[i]-'
a']==size[s2[i]-'
a'])
else
if(size_tmp[s2[z]-'
a']==size[s2[z]-'
a']) break; //
沒有容量了
} }
if(len==len_s1) return
true
; }
return
false
; }
};
此處可以不用map容器,只是一開始查詢想到了map,後來規定狀態才想到了陣列。
leetcode 位元組跳動 挑戰字串
輸入 flower flow flight 輸出 fl 輸入 dog racecar car 輸出 解釋 輸入不存在公共字首。class solution if flag 1 n if flag 0 return 在這題中直接返回子字串。如果不存在公共字首,返回空字串 示例 1 輸入 flower ...
2020 09 06位元組跳動後端
分析 這道題我是用的動態規劃來求解,和傳統的上樓梯問題不同,它多了乙個不能連續走兩步的條件,但我認為沒什麼不同。根據題意,最後一步要麼是2要麼是1,如果最後一步是2,則要考慮不能連續走兩步的限制情況。也就是說,對於乙個已經走到n 2步的人來說,他只能由n 3步走1步得到,而不能由n 4步走兩步得到....
位元組跳動mysql面試 位元組跳動 Golang面試
應朋友之邀,今天下午去位元組送了顆人頭,最後不負眾望,被面試官攆出來了 一面mysql索引快的原理 回答這個問題需要先看一下資料庫的儲存結構 頁結構頁和頁之間的關係 頁和頁之間的關係 有個知識,之前不知道的 聚集索引 以主鍵建立的索引,葉子節點儲存的是表中的資料 非聚集索引 非主鍵建立的索引,葉子節...