統計重複個數(迴圈節)
466. 統計重複個數
難度困難
由 n 個連線的字串 s 組成字串 s,記作s = [s,n]
。例如,["abc",3]
=「abcabcabc」。
如果我們可以從 s2 中刪除某些字元使其變為 s1,則稱字串 s1 可以從字串 s2 獲得。例如,根據定義,"abc" 可以從 「abdbec」 獲得,但不能從 「acbbe」 獲得。
現在給你兩個非空字串 s1 和 s2(每個最多 100 個字元長)和兩個整數 0 ≤ n1 ≤ 106 和 1 ≤ n2 ≤ 106。現在考慮字串 s1 和 s2,其中s1=[s1,n1]
、s2=[s2,n2]
。
請你找出乙個可以滿足使[s2,m]
從s1
獲得的最大整數 m 。
示例:
輸入:
s1 ="acb",n1 = 4
s2 ="ab",n2 = 2
返回:2
答:
class solution:
def getmaxrepetitions(self, s1: str, n1: int, s2: str, n2: int) :
diction=dict()
s1cnt,s2cnt,n=0,0,0
while true: #尋找迴圈節node
s1cnt += 1
for i in s1:
if i==s2[n]:
n+=1
if n==len(s2):
n,s2cnt=0,s2cnt+1
if n in diction:
s1_first,s2_first=diction[n]
s1_node,s2_node=s1cnt,s2cnt
break
else:
diction[n]=(s1cnt,s2cnt)
#每幾個s1包含幾個s2
each=(s1cnt-s1_first,s2cnt-s2_first)
#s1中s2的數目
cnt=s2_first+(n1-s1_first)//each[0]*each[1]
#s1中剩餘的匹配
re=(n1-s1_first)%each[0]#求出剩下的s1的個數,再去暴力匹配s2
for i in range(re):
for i in s1:
if i == s2[n]:
n += 1
if n == len(s2):
n, cnt = 0, cnt + 1
return cnt//n2
解析做法:emm,這題有點難搞,剛開始是直接暴力,直接超時,思考後選擇匹配出s2的s1個數,但沒有用迴圈節,這種複雜因素很多並且我沒有處理好。
後來無奈看了解析,知道了使用迴圈節(類似小數點無先迴圈,不算剛開頭無序部分)
由迴圈計算得到沒幾個s1就可以得到乙個s2,利用n1計算結果,還沒結束哦,s1剩下的s1雖然不能構造乙個迴圈節但是仍然有機會匹配出s2(s2絕大多數不等於迴圈節),所以利用剩下的s1個數暴力匹配s2
注意:
每天一道題 LeetCode
本人是研二程旭猿一枚,還有半年多就要找工作了,想想上一年度面試阿里的演算法工程師掛了,心有不甘啊,主要還是準備不足,對一些常見的演算法問題沒有去組織準備,為了明年找乙份好的實習,就從現在開始,好好準備吧,每天刷一道題。leetcode,oj系統,不用多說,國外的,題目也非常好,只有精選的152道,不...
每天一道leetcode 打家劫舍(動態規劃)
198.打家劫舍 難度簡單839收藏分享切換為英文關注反饋 你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你不觸動...
每天一道Linux命令
no.1 以下的命令得在 自動執行 06 03 3 lp usr local message mail s server message root a.每週三06 03分 b.每週六03 03分 c.每週三03 06分 d.每週六03 06分 no.2 下列關於管道 pipe 通訊的敘述中,正確的是...