2017-07-02 17 views
2

このコードを最適化する必要があります。基本的には、文字列s1のすべての文字が倍精度を考慮してs2に含まれているかどうかを確認します。Pythonでこのコードを最適化する方法

s1, s2 = list(s1), list(s2) 
for s in s2: 
    if s in s1: 
     s1.remove(s) 
    else: 
     return False 
return True 

(私は非常に新しいですが解決策があるが、今の私はかなり混乱し、イライラだ私はmap、イテレータと発電機のいくつかの研究をした、と私は、これらの一つ以上に確信していますPythonには数週間しかかかりません)、このケースで何が最善の戦略であるかを理解する助けになるかもしれません。ありがとう!

+0

このような場合はわかりません。 's1.remove(s)'は重複した文字のエラーを避けるためにのみ存在します。たとえば、 's1 = 'aabcd''と' s2 =' aaa''はfalseの間に 'True'を返します。 list1 - list2が私にどのように役立つでしょうか?私がこれを間違っている場合は、私に説明してください – AndTuf

+1

あなたの予想される出力が何であるかは明確ではありません。 [mcve]を表示してください。 –

+0

Pythonで 'in'の実装を知らないと、このコードはO(n^2)最悪のケースにつながりませんか? nlognの解決策は、それらが等しいかどうかをソートしてチェックすることです。 –

答えて

3

正しく複製された文字を処理しますCounterを使用したソリューション:

from collections import Counter 
c1 = Counter(s1) 
c2 = Counter(s2) 
return all(c2[c]>=c1[c] for c in c1) 
+1

あなたは '> ='を使いたくないので、 '=='だけが必要です。それ以外は、良い答えです! –

+1

これはいいです、ありがとう! 'c2 [c]> = c1 [c]'ではなく 'c1 [c]> = c2 [c]'ですが、偉大な答えは – AndTuf

+3

です@NoticeMeSenpaiもしs1とs2が全く同じ文字を含んでいれば、正しく、 '=='を使うべきです。 それ以外の場合は、s2を完全に読み取る必要はなく、さらに最適化することができます(特に、s2がs1よりもかなり長い場合)。 –

0

うーん...あなたが文字列としてs1s2を維持し、その後replace機能を使用できます。

for c in s2: 
    if c in s1: 
     s1 = s1.replace(c, '', 1) 
    else: 
     return False 

return True 

str.replace(.., .., 1)は削除その文字の最初の発生を。

+0

'str.replace'は、重複を正しく処理する必要がある間にすべてのオカレンスを削除するので使用できません。 – AndTuf

+0

@AndTuf Edited。 –

+0

ああ、私の悪いこと、よく知っておいてください – AndTuf

1

あなたは両方の文字列の各文字の出現回数をカウントすることができます。また、文字列をリストにする必要はありません。文字列は独自のイテレータです。

まず、O(1)の平均ルックアップがあるため、setを作成します。 次に、セットを繰り返して、各文字の数を取得します。カウントが等しくない場合、return False。文字列のサイズが大きくなるように、それはまた、あなたの現在のソリューションよりも、はるかに優れたスケール:

s1 = 'Stack Overflow' 
s2 = 'woltk fcrSeavO' 

def equal_chars(s1, s2): 
    chars = set(s2) 
    for char in chars: 
     if s1.count(char)!= s2.count(char): 
      return False 
    return True 

print(equal_chars(s1, s2)) 
0

(多分?)、より効率的であるエイドリアンの偉大な答えに若干の調整:

from collections import Counter 

s1 = "hello" 
s2 = "helo" 

def count_chars(s1,s2): 
    c2 = Counter(s2) 
    for k,v in Counter(s1).items(): 
     if c2[k] < v: 
      return False 
    return True 

print (count_chars(s1,s2)) 

結果:

False 
関連する問題