文字列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