LeetCode-Python-1400。Kパリンドローム文字列を構築(文字列+ハッシュテーブル)

文字列sと整数kを与えます。s文字列のすべての文字を使用して、k個の空でない回文文字列を作成してください。

sのすべての文字でk回文文字列を作成できる場合は、Trueを返します。それ以外の場合は、Falseを返します。

 

例1:

入力:s = "annabelle"、k = 2
出力:true
説明:すべての文字がsである2つの回文文字列を作成できます。
「anna」+「elble」、「anbna」+「elle」、「anellena」+「b」の
例:

入力:s = "leetcode"、k = 3
出力:false
説明:すべての文字がsである3つの回文ストリングを構成できません。
例3:

入力:s = "true"、k = 4
出力:true
説明:実行可能な唯一の解決策は、sの各文字を個別に文字列を形成することです。
例4:

入力:s = "yzyzyzyzyzyzyzyzy"、k = 2
出力:true
説明:すべてのzを1つの文字列に入れ、すべてのyを別の文字列に入れるだけです。次に、両方のストリングは回文ストリングです。
例5:

入力:s = "cr"、k = 7
出力:false
説明:7つの回文文字列を構成するのに十分な文字がありません。
 

ヒント:

1 <= s.length <= 10 ^ 5
sのすべての文字は小文字の英字です。
1 <= k <= 10 ^ 5

ソース:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/construct-k-palindrome-strings
copyrightは、控除ネットワークに属しています。商用転載の正式な許可書に連絡し、非商用転載の出典を明記してください。

アイデア:

最初に、より単純なケースを扱います。

1. sの長さがkと等しい場合、各文字は個別に文字列を形成し、答えが存在する必要があります。

2. sの長さがkより小さい場合、答えは存在してはなりません。

 

これで、sの長さがkより大きいことを保証できます。

次に、sの各要素の出現回数を数えます。

1.要素の出現数が偶数(k)の場合、少なくとも0個のパリンドローム文字列、最大でk個のパリンドローム文字列を使用できます。

2.要素の出現回数が奇数(k)の場合、この要素を処理するには、少なくとも1つの回文文字列、最大でk個の回文文字列が必要です。

したがって、答えに実際に影響するのは、奇数回出現する要素の数です。A要素の出現数が奇数であると想定すると、少なくともAのパリンドローム文字列が必要です。

偶数の出現を持つ他の要素の場合、偶数の文字を既存の回文文字列にラップすることができるため、回文文字列の数には影響しません。

時間の複雑さ:O(N)

スペースの複雑さ:O(N)

class Solution(object):
    def canConstruct(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: bool
        """
        if k >= len(s):
            # 长度 == k,必然可以;长度 < k,必然不可以。
            return k == len(s)

        from collections import Counter
        dic = Counter(s) 

        s_odd = 0
        for val in dic.values():
            if val % 2:
                s_odd += 1
        return s_odd <= k

 

元の記事を734件公開 121件の賞賛 21万回表示

おすすめ

転載: blog.csdn.net/qq_32424059/article/details/105549613