字串-暴力搜尋-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 ""