1. 程式人生 > 其它 >字串-暴力搜尋-2014. 重複 K 次的最長子序列

字串-暴力搜尋-2014. 重複 K 次的最長子序列

2021-10-0815:49:36

問題描述:

給你一個長度為 n 的字串 s ,和一個整數 k 。請你找出字串 s 中 重複 k 次的 最長子序列 。

子序列 是由其他字串刪除某些(或不刪除)字元派生而來的一個字串。

如果seq * k 是 s 的一個子序列,其中 seq * k 表示一個由 seq 串聯 k次構造的字串,那麼就稱 seq 是字串 s 中一個 重複 k 次 的子序列。

舉個例子,"bba" 是字串 "bababcba" 中的一個重複 2 次的子序列,因為字串 "bbabba" 是由 "bba" 串聯 2 次構造的,而"bbabba" 是字串 "bababcba" 的一個子序列。
返回字串 s 中 重複 k 次的最長子序列 。如果存在多個滿足的子序列,則返回 字典序最大 的那個。如果不存在這樣的子序列,返回一個 空 字串。

示例 1:

輸入:s = "letsleetcode", k = 2
輸出:"let"
解釋:存在兩個最長子序列重複 2 次:let" 和 "ete" 。
"let" 是其中字典序最大的一個。
示例 2:

輸入:s = "bb", k = 2
輸出:"b"
解釋:重複 2 次的最長子序列是 "b" 。
示例 3:

輸入:s = "ab", k = 2
輸出:""
解釋:不存在重複 2 次的最長子序列。返回空字串。
示例 4:

輸入:s = "bbabbabbbbabaababab", k = 3
輸出:"bbbb"
解釋:在 "bbabbabbbbabaababab" 中重複 3 次的最長子序列是 "bbbb" 。

提示:

n == s.length
2 <= k <= 2000
2 <= n < k * 8
s 由小寫英文字母組成

問題求解:

問題的規模決定了可以進行暴力搜尋,另外,通過python實現可以非常簡潔高效。

    def longestSubsequenceRepeatedK(self, s: str, k: int) -> str:
        freq = Counter(s)
        hot = ''.join(c * (freq[c] // k) for c in sorted(freq, reverse=True))
        for i in range(len(hot), 0, -1):
            for item in permutations(hot, i):
                word = "".join(item)
                ss = iter(s)
                if all(c in ss for c in word * k):
                    return word
        return ""