Google的一道经典面试题 - 767. 重构字符串

Google的一道经典面试题 - 767. 重构字符串

767. 重构字符串

题目链接:767. 重构字符串
题目大意:给定一个字符串 s ,检查是否能重新排布其中的字母,使得两相邻的字符不同。
返回 s 的任意可能的重新排列。若不可行,返回空字符串 “” 。

注意:(1)1 <= s.length <= 500;(2)s 只包含小写字母。

示例:

输入: s = "aab"
输出: "aba"

输入: s = "aaab"
输出: ""

参考代码:

class Solution:
    def reorganizeString(self, s: str) -> str:
        cnt = Counter(s)
        st = sorted(cnt,key=lambda k:0-cnt[k])
        if cnt[st[0]] > (len(s)+1)//2: return ""
        res = []
        for i in st:
            res += [i]*cnt[i]
        ans = [None for _ in range(len(res))]
        ans[::2] = res[:len(ans[::2])]
        ans[1::2] = res[len(ans[::2]):]
        return ''.join(ans)
  • 时间复杂度: O ( n + ∣ Σ ∣ ) O(n+|\Sigma|) O(n+∣Σ∣),其中 n n n 是字符串的长度, Σ \Sigma Σ 是字符集,在本题中字符集为所有小写字母, ∣ Σ ∣ = 26 |\Sigma|=26 ∣Σ∣=26。遍历字符串并统计每个字母的出现次数,时间复杂度是 O ( n ) O(n) O(n)。重构字符串需要进行 n n n 次放置字母的操作,并遍历每个字母得到出现次数,时间复杂度是 O ( n + ∣ Σ ∣ ) O(n+|\Sigma|) O(n+∣Σ∣)
  • 空间复杂度: O ( ∣ Σ ∣ ) O(|\Sigma|) O(∣Σ∣),其中 n n n 是字符串的长度, Σ \Sigma Σ 是字符集,在本题中字符集为所有小写字母, ∣ Σ ∣ = 26 |\Sigma|=26 ∣Σ∣=26

1054. 距离相等的条形码

相似题型:1054. 距离相等的条形码
题目大意:在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。
请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。

注意:(1)1 <= barcodes.length <= 10000;(2)1 <= barcodes[i] <= 10000。

示例:

输入:barcodes = [1,1,1,2,2,2]
输出:[2,1,2,1,2,1]

输入:barcodes = [1,1,1,1,2,2,3,3]
输出:[1,3,1,3,2,1,2,1]

参考代码:

class Solution:
    def rearrangeBarcodes(self, barcodes: List[int]) -> List[int]:
        cnt = Counter(barcodes)
        st = sorted(cnt,key=lambda k:0-cnt[k])
        res = []
        for i in st:
            res += [i]*cnt[i]
        ans = [None for _ in range(len(res))]
        ans[::2] = res[:len(ans[::2])]
        ans[1::2] = res[len(ans[::2]):]
        return ans
  • 复杂度分析和上面差不多,不过 Σ = 10000 \Sigma=10000 Σ=10000

结论

  • 排序这一块的题目还是比较难的,关于 .sort()和sorted()函数的应用非常广泛且灵活多变,很有意思的,加油吧,努力学习。

猜你喜欢

转载自blog.csdn.net/weixin_42269028/article/details/129323883