2016-12-30 4 views
-1

アルゴリズム/データ構造を学習しようとしています。私の知識を向上させるために、私はいくつかのオンライン問題を解決しようとしています。 私は法の下に試してみましたpracticeque0,1または2だけからなる文字列が与えられた場合、0、1および2の等しい数を持つ部分文字列の数を数えます。

で与えられている解決しようとしています問題のひとつ:

def count_zero_one_two(): 
    s = '102100211' 
    s_len = len(s) 
    count = 0 
    for i in range (s_len-1): 
     j = i+1 
     k = j+1 
     #print i, j, k, count 
     #print s[i], s[j], s[k] 
     if k > (s_len-1): 
      print "end" 
      break 

     elif (s[i] != s[j]) and (s[i] !=s[k]) and (s[j] != s[k]): 
      print s[i], s[j], s[k] 
      print "not equal" 
      count = count+1 
      #print count 
     else: 
      print s[i], s[j], s[k] 
      print "equal" 
     k = j +i 
    print count 


count_zero_one_two() 

質問:私の入力文字列がある場合、「102100211」、次に5をする必要があります数えるが、私は4を得る。

+0

問題は次のとおりです。0,1または2だけの文字列を指定すると、count 0、1、2の同数の部分文字列の数。 –

+0

102、021、210、021,210021 - これはこの例の回答です。うまくいけば、これはあなたにこの問題に対する新しいアプローチが必要であることを納得させるでしょう。 –

+0

ここでは構文に1つの問題があります: 'x = '9999999'' 'for i in range(len(x)-1):print i'は' 0,1,2,3,4,5,6あなたが期待しているように、「9,9,9 ...」ではないようなものです。 –

答えて

2

私はこのようにそれを解決するだろう:

def count_zero_one_two(s): 
    num = 0 
    for i in range(len(s)): 
     for j in range(1, len(s)/3 + 1): 
      if all(s[i:i+3*j].count(n) == j for n in '012'): 
       num += 1 
    return num 

all()は(反復ごと)すべての3つの文字が「012」であることを確認するために使用されます。等

内側forループは長さ3,6の配列で0、1、2の数をカウントするために使用され、9、

出力:

>>> s = '0102010' 
>>> count_zero_one_two(s) 
2 
>>> 
>>> s = '102100211' 
>>> count_zero_one_two(s) 
5 
+0

この場合でも、文字列 '102100211' - num = 4の場合、予想される出力は5 –

+0

です@RoryDaulton、今、それは他の場合にも有効です! – ettanany

+0

はい、今はうまくいくと思います。 'count(n)== j'チェックがそれを保証するので、s [i:i + 3 * j]のコードnは冗長であるようです。私が誤解していないならば、このアルゴリズムはO(n ** 3)であり、ここでnはlen(s)であり、これは1000の長さのために10億のオーダーを意味する。私は頭の上からはるかに速いアルゴリズム。 –

0
from collections import Counter 

def countSub(s): 
    result = [] 

    for i in range(3, len(s), 3): 
     t = s[:i] 
     c = list(Counter(t).values()) 
     if (c[0]==c[1]==c[2]): 
      result.append((t, c[0])) 

    return result 


def count(s): 
    result = [] 
    for i in range(len(s)-2): 
     result.extend(countSub(s[i:])) 

    return set(result) 




ss = count("102100211")  
print("%s substrings found: " % len(ss), ss)  

出力:

4 substrings found (not counting duplicates and empty strings): 
    {('021', 1), ('210021', 2), ('210', 1), ('102', 1)} 
関連する問題