亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何找到從 s1 到 s2 的最小可能循環移位?

如何找到從 s1 到 s2 的最小可能循環移位?

子衿沉夜 2023-04-11 15:18:06
如果我有 2 個字符串s1和s2,其中s2是循環移位的字符串s1。s1它需要找到從到的最小可能循環偏移s2。讓我舉個例子:s1 = 'I love cookies 's2 = 'cookies I love ' 答案是7。最好采用線性時間。有我失敗的試驗:def find_minimum_cyclic_shift(s1, s2):        if len(s1) != len(s2):            return -1        index = s2.index(s1[0])        if (index > -1):            if (s1==s2):                return 0;            #finalPosition = len(s2) - index            #print(finalPosition, " index=",index)            #return s2[0] == s1[finalPosition] and s1[finalPosition::]==s2[0:index]        return index但它不適用于 case: absabsabsfand absfabsabs。而不是 4 我有 0. 因為索引函數只返回我第一次出現的字母。請至少給我一個邏輯來編碼它。
查看完整描述

1 回答

?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

find您可以簡單地在雙字符串上使用,如下所示:


s1 = 'I love cookies '

s2 = 'cookies I love '


answer = min((s1*2).find(s2), (s2*2).find(s1))

print(answer)

輸出:


7

-1(如果s2不是 的循環移位,將打印s1)。


它起作用的原因是如果s2確實是 的循環移位s1,那么連接s1到自身將包含s2中間的某個地方。


s1幸運的是,這個“某處”正好是所需移位的大小(出現在s2第一個字符之前的字符數)。


我們還需要檢查“其他方向”以獲得可能更短的移位,因此我們從兩個可能的方向獲取最小結果(技術上可以使用算術來避免第二次搜索,如果結果是那么答案很簡單 -> n/2結果n。


關于運行時復雜性的注意事項:我的解決方案不保證線性時間,基于這個答案,它可以O(N*N)在最壞的情況下使用。


查看完整回答
反對 回復 2023-04-11
  • 1 回答
  • 0 關注
  • 429 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號