2013-10-26 25 views
7

私はこのコードを別のトピックで見つけましたが、アルファベット順ではなく連続した文字で部分文字列をソートします。どのようにアルファベット順に修正するのですか?それはlkを印刷し、cclを印刷したいと思います。おかげアルファベット順に最長の部分文字列を見つける

PS:これまで

 if len(set(substr)) != (end - start): # found duplicates or EOS 
      break 
     if (ord(max(sorted(substr))) - ord(min(sorted(substr))) + 1) == len(substr): 

:あなたの例の入力のためのcclが表示されます

​​

私はPythonで初心者だ

s = 'cyqfjhcclkbxpbojgkar' 
from itertools import count 

def long_alphabet(input_string): 
    maxsubstr = input_string[0:0] # empty slice (to accept subclasses of str) 
    for start in range(len(input_string)): # O(n) 
     for end in count(start + len(maxsubstr) + 1): # O(m) 
      substr = input_string[start:end] # O(m) 
      if len(set(substr)) != (end - start): # found duplicates or EOS 
       break 
      if (ord(max(sorted(substr))) - ord(min(sorted(substr))) + 1) == len(substr): 
       maxsubstr = substr 
    return maxsubstr 

bla = (long_alphabet(s)) 
print "Longest substring in alphabetical order is: %s" %bla 
+0

"アルファベット順で最も長い" とは何を意味するのでしょうか?あなたがプリントする1つの値はどのようにして順番どおりにできますか? –

+0

ねえ、ようこそ、StackOverflow!私たちは、あなた自身が問題に悩まされた場合(あなたが試したことを説明してください)(http://whathaveyoutried.com)、あなたを助けることができる可能性が非常に高いです。適切な質問の詳細については、スタックオーバーフロー[質問チェックリスト](http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist)を参照してください。幸運と幸せなコーディング! –

+0

こんにちは、お返事ありがとうございます。たとえば、s = 'tjkocgygiwc'の場合、アルファベット順の最長部分文字列は 'jko'です。この「jko」を見つける方法はありません。プログラムはjkを見つけます。 'wvcdcgykkaypy'で 'wv'と 'cgy'が見つからない – spacegame

答えて

4

はこれを変更してみてください文字列。あなたはあなたが文字列の最大長の注文ストリングの実行に分けることができることを注目して、あなたのアルゴリズムを改善することができ

+0

助けてくれてありがとう、あなたは私の人生を救った。 – spacegame

+0

aha ...これは、timsortが実行を検出する方法です。 –

12
s = 'cyqfjhcclkbxpbojgkar' 
r = '' 
c = '' 
for char in s: 
    if (c == ''): 
     c = char 
    elif (c[-1] <= char): 
     c += char 
    elif (c[-1] > char): 
     if (len(r) < len(c)): 
      r = c 
      c = char 
     else: 
      c = char 
if (len(c) > len(r)): 
    r = c 
print(r) 
+3

これを説明するためのコメントや変数の意味のある名前は、ここではわかりやすくするために役立ちます。 – sniels

1

:-)単純な問題を解決しようとしているので、コードが簡単です。どれ命じた部分文字列は、これはあなただけのPythonの文字比較では文字列のO(n)の

def longest_substring(string): 
    curr, subs = '', '' 
    for char in string: 
     if not curr or char >= curr[-1]: 
      curr += char 
     else: 
      curr, subs = '', max(curr, subs, key=len) 
    return max(curr, subs, key=len) 
1

を通じて一度繰り返すことができますこれらの実験の1

に含まれなければならないところASCII値Javaスクリプトに比べて簡単です。比較する必要があります。

def comp(a,b): 
    if a<=b: 
     return True 
    else: 
     return False 
s = raw_input("Enter the required sting: ") 
final = [] 
nIndex = 0 
temp = [] 
for i in range(nIndex, len(s)-1): 
    res = comp(s[i], s[i+1]) 
    if res == True:  
      if temp == []: 
      #print i 
       temp.append(s[i]) 
       temp.append(s[i+1]) 
      else: 
       temp.append(s[i+1]) 
     final.append(temp) 
     else: 
     if temp == []: 
     #print i 
     temp.append(s[i]) 
     final.append(temp) 
     temp = [] 
lengths = [] 
for el in final: 
    lengths.append(len(el)) 
print lengths 
print final 
lngStr = ''.join(final[lengths.index(max(lengths))]) 
print "Longest substring in alphabetical order is: " + lngStr 
+0

は 'C'コードのようです。最適な方法はありますか? – AAI

0
ます:pythonによると、次のアルゴリズムを使用して見つけることができるこのアルファベット順で最長のサブ文字列を使用してブール真

ブール偽B与え> aとb> aが与えられます

若干異なる実装、アルファベット順にすべてのサブストリングのリストを構築し、最長1を返す:

def longest_substring(s): 
    in_orders = ['' for i in range(len(s))] 
    index = 0 
    for i in range(len(s)): 
     if (i == len(s) - 1 and s[i] >= s[i - 1]) or s[i] <= s[i + 1]: 
      in_orders[index] += s[i] 
     else: 
      in_orders[index] += s[i] 
      index += 1 
    return max(in_orders, key=len) 
+0

if条件がどのように作用するかに関するコメントや説明をお願いします。 – AAI

1

再帰的な方法で、あなたは私がすることができますmport からitertools

か、同じ方法で定義します。この方法では

def loops(I=0, S=1): 
    n = I 
    while True: 
     yield n 
     n += S 

をあなたのanalliticプロセスのどの部分文字列を作成するとき、あなたは、エンドポイントの値を取得することができます。

は今anallize方法に見える(spacegame問題と氏をもとにしTim Petters提案)

def anallize(inStr): 
    # empty slice (maxStr) to implement 
    # str native methods 
    # in the anallize search execution 
    maxStr = inStr[0:0] 
    # loop to read the input string (inStr) 
    for i in range(len(inStr)): 
     # loop to sort and compare each new substring 
     # the loop uses the loops method of past 
     # I = sum of: 
     #  (i) current read index 
     #  (len(maxStr)) current answer length 
     #  and 1 
     for o in loops(i + len(maxStr) + 1): 
      # create a new substring (newStr) 
      # the substring is taked: 
      # from: index of read loop (i) 
      # to: index of sort and compare loop (o) 
      newStr = inStr[i:o] 

      if len(newStr) != (o - i):# detect and found duplicates 
       break 
      if sorted(newStr) == list(newStr):# compares if sorted string is equal to listed string 
       # if success, the substring of sort and compare is assigned as answer 
       maxStr = newStr 
    # return the string recovered as longest substring 
    return maxStr 

最後に、テストまたは実行pourposes用:

# for execution pourposes of the exercise: 
s = "azcbobobegghakl" 
print "Longest substring in alphabetical order is: " + anallize(s) 

の素晴らしい作品この仕事は以下から始まりました:spacegameそしてMr.Tim Pettersは、ネイティブのstrメソッドとコードの再利用性を利用しています。

答えは:アルファベット順に

最長部分文字列は次のとおりです。CCL

-1

別の方法:

s = input("Please enter a sentence: ") 
count = 0 
maxcount = 0 
result = 0 
for char in range(len(s)-1): 
    if(s[char]<=s[char+1]): 
     count += 1   
    if(count > maxcount): 
      maxcount = count 
      result = char + 1 

    else: 

     count = 0 
startposition = result - maxcount 
print("Longest substring in alphabetical order is: ", s[startposition:result+1]) 
+0

これを試してみてください。センテンスを入力してください:sentententensebenz アルファベット順の最長の部分文字列は:間違っています。ここで最長のsubstrongは "benz"です! – AAI

0
s = "azcbobobegghakl" 
ls = "" 
for i in range(0, len(s)-1): 
    b = "" 
    ss = "" 
    j = 2 
    while j < len(s): 
     ss = s[i:i+j] 
     b = sorted(ss) 
     str1 = ''.join(b) 
     j += 1 
     if str1 == ss: 
      ks = ss 
     else: 
      break 
    if len(ks) > len(ls): 
     ls = ks 
print("The Longest substring in alphabetical order is "+ls) 
+0

答えを説明するためにコメントを追加するか、コードを読みやすくするために変数に意味のある名前を使用する方がよいでしょう。 –

1

使用リストと大幅にコードを減らすために、最大の機能。

actual_string = 'azcbobobegghakl' 
strlist = [] 
i = 0 
while i < len(actual_string)-1: 
    substr = '' 
    while actial_string[i + 1] > actual_string[i] : 
     substr += actual_string[i] 
     i += 1 
     if i > len(actual_string)-2: 
      break 
    substr += actual-string[i] 
    i += 1 
    strlist.append(subst) 
print(max(strlist, key=len)) 
+1

アルゴリズムはうまく動作します。コメントは、 "a"が "a"の後に続く一致を探したいということだけです。したがって、希望するのは です。actual_string [i + 1]> = actual_string [i] 以前のものより大きいまたは等しい文字 –

0
s = 'cyqfjhcclkbxpbojgkar' 
longest = "" 
max ="" 

for i in range(len(s) -1): 
    if(s[i] <= s[i+1]): 
     longest = longest + s[i] 
     if(i==len(s) -2): 
      longest = longest + s[i+1] 
    else: 
     longest = longest + s[i]   
     if(len(longest) > len(max)): 
      max = longest 
     longest = ""   

if(len(s) == 1): 
    longest = s 


if(len(longest) > len(max)): 
    print("Longest substring in alphabetical order is: " + longest) 
else: 
    print("Longest substring in alphabetical order is: " + max) 
関連する問題