day08 466. 統計重複個數 [困難]

1.題目描述  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

 

2.思路分析

        1.按照文中數量的提示,用長字符串來做匹配是不行的,因爲可能很長

        2.按照短的子串來匹配,就要考慮子串和2倍子串兩種情況

        3.若N2==2*N1,那麼按照一倍的倍數計算即可q=n1*N1

        4.若N2>2*N1,按照q = n1//2*N2 + n1%2*N1即可

        5.最後一步計算 M = q//n2

實際上這個思路不對,不能處理更多的情況,改爲了從1開始嘗試各個倍數字符串知道找到當前收益開始降低的倍數爲止,但是這個思路也是不對,因爲可能收益先降低後又升高到最大值,根據bad case分析,最多嘗試到最小公倍數/n1倍數次,結果邏輯對了,但是超時了

 

3.debug過程

對於leetcode的困難題,印象就研究過兩個,不看題解,基本上得不到ac解,還需繼續努力。而且即使得到邏輯正確的解也是不斷嘗試摸索過程,有點費勁,後續,暫時先不考慮困難的題目了,只考慮中等題目,因爲困難題目面試中說實話也很難遇到,基本上以<=中等難度爲主

 

4.ac代碼[運行超時](python)

class Solution(object):
    def getMaxRepetitions(self, s1, n1, s2, n2):
        """
        :type s1: str
        :type n1: int
        :type s2: str
        :type n2: int
        :rtype: int
        思路:
        1.按照文中數量的提示,用長字符串來做匹配是不行的,因爲可能很長
        2.按照短的子串來匹配,就要考慮子串和2倍子串兩種情況
        3.若N2==2*N1,那麼按照一倍的倍數計算即可q=n1*N1
        4.若N2>2*N1,按照q = n1//2*N2 + n1%2*N1即可
        5.最後一步計算 M = q//n2
        """

        def lcm(x, y):
            #最小公倍數
            if x > y:
                greater = x
            else:
                greater = y

            while (True):
                if ((greater % x == 0) and (greater % y == 0)):
                    lcm = greater
                    break
                greater += 1
            return lcm

        def get_generate_count(s1, s2):
            # 判斷s2是否可以通過s1刪減某些字符得到
            i = j = 0
            s1_len = len(s1)
            s2_len = len(s2)
            count = 0
            while True:
                if i == s1_len:
                    break
                if s1[i] == s2[j]:
                    j += 1
                    if j == s2_len:
                        j = 0
                        count += 1
                i += 1
            return count

        num = get_generate_count(s1, s2)
        best_ratio = 1
        max_roi = num
        nums = [num]
        ratio = 1
        max_ratio = lcm(len(s1), len(s2))/ len(s1)
        while True:
            ratio += 1
            if ratio > n1:
                break
            tnum = get_generate_count(s1 * ratio, s2)
            nums.append(tnum)
            if tnum / ratio > max_roi:
                max_roi = tnum / ratio
                num = tnum
                best_ratio = ratio
            else:
                if ratio >= max_ratio:
                    break
        q = n1 // best_ratio * num
        if n1 % best_ratio - 1 > -1:
            q += nums[n1 % best_ratio - 1]
        return q // n2

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章