1

指定された入力文字列について、input = "abbbbdeeefffddddb"それを解析したい

result = ['a', 'b', 'bb', 'bd', 'd', 'e', 'ee', 'f', 'ff', 'dd', 'db']

この解析の背後にあるロジックは次のとおりです。部分文字列が初めて検出された場合、それは解析されて取り除かれます。部分文字列が出現するたびに、次の文字と連結されて解析されます。

説明する:

  1. 「a」(位置 0) を見たことがありますか? いいえ 解析します。
  2. "b" (位置 1) を見たことがありますか? いいえ 解析します。
  3. 「b」(位置 2) を見たことがありますか? はい; 次の文字とマージ
  4. 「bb」(ポジション 2 と 3)を見たことがありますか?いいえ 解析します。
  5. 「b」(位置 4) を見たことがありますか? はい 次の文字とマージします
  6. 「bd」(位置 4 & 5) を見たことがありますか? いいえ 解析します...

これは最後まで続きます。

私は次のコードでこれを達成しようとしました:

input = "abbbbdeeefffddddb"

comparator = []

def parse(string):
    for pointer in range(len(string)-1):
        if string[pointer] not in comparator:
            comparator.append(string[pointer])

        else:
            substring = string[pointer] + string[pointer+1]
            comparator.append(substring)

        print comparator 

parse(input)

結果は次のとおりです。['a', 'b', 'bb', 'bb', 'bd', 'd', 'e', 'ee', 'ef', 'f', 'ff', 'fd', 'dd', 'dd', 'dd', 'db']

そして、それは間違っています。ここには重要な部分がありませんが、実装方法がわかりません。再帰関数が必要になるか、どこかでbreakorを使用する必要があります。continue

この特定の入力に対してのみソリューションを提供しないでください。ここに示す入力は、例のためのものです。ソリューションは、さまざまな入力にも適用できるように一般的でなければなりません。

元のアルゴリズムは次のとおりです。6 ページ:論文

4

3 に答える 3

2

バイグラムから解析された文字をスキップすることを忘れているようです:

def parse(string):
    pointer = 0
    while pointer < len(string):
        if string[pointer] not in comparator:
            comparator.append(string[pointer])
        else:
            substring = string[pointer] + string[pointer+1]
            comparator.append(substring)
            pointer += 1
        pointer += 1
    print comparator
['a', 'b', 'bb', 'bd', 'e', 'ee', 'f', 'ff', 'd', 'dd', 'db']

または少し書き直した

def parse(string):
    result = set()
    letters = iter(string)
    for letter in letters:
        if letter not in result:
            result.add(letter)
        else:
            substring = letter + letters.next()
            result.add(substring)
    return list(result)
# same set, different order
['a', 'bd', 'b', 'e', 'd', 'bb', 'f', 'ee', 'dd', 'db', 'ff'] 
于 2013-11-05T21:36:07.203 に答える
2

これはあなたが欲しいものについてですか?

$ cat single-seen-double
#!/usr/bin/python3

def single_seen_double(string):
    length = len(string)
    index = 0
    seen = set()
    while index < length:
        if string[index] in seen and index < length - 1:
            yield string[index:index+2]
            index += 2
        else:
            seen.add(string[index])
            yield string[index]
            index += 1

def main():
    print(list(single_seen_double("abbbbdeeefffddddb")))

main()

zareason-dstromberg:~/src/outside-questions/single-seen-double x86_64-pc-linux-gnu 5871 - above cmd done 2013 Tue Nov 05 01:48 PM

$ ./single-seen-double
['a', 'b', 'bb', 'bd', 'e', 'ee', 'f', 'ff', 'd', 'dd', 'db']

サンプル出力はあまり得られませんが、これが本当に探していたものではないのではないかと思います。それがあなたが必要としているものではない場合、あなたが従わなければならない規則について、より具体的に教えていただけますか?

于 2013-11-05T21:51:20.103 に答える