สตริงที่ยาวที่สุดตามลำดับตัวอักษร

รหัสนี้ทำงานได้ดีกับสตริงทั้งหมด ยกเว้นสตริงที่จำเป็นต้องใช้อักขระตัวสุดท้าย

s='abcdefghijklmnopqrstuvwxyz'
sub =''
test =s[0]

for n in range(len(s)-1):
    if len(test) > len(sub):
        sub = test
    if s[n] >= s[n-1]:
        test += s[n]
    else:
        test = s[n]

print 'Longest substring in alphabetic order is: ' + str(sub) 

How do you suggest a possibility for doing this?

ขอบคุณล่วงหน้านะทุกคน!

PS:

ขอบคุณสำหรับคำตอบจนถึงตอนนี้ ปัญหาคือไม่ว่าฉันจะพิมพ์ช่วงใด ตัวแปรย่อยที่ฉันจะพิมพ์ ไม่ได้รับตัวอักษรทั้งหมดที่ฉันต้องการ การวนซ้ำจะเสร็จสิ้นก่อน :\ บางทีอาจเป็นปัญหากับตัวโปรแกรมเอง

มีเคล็ดลับพิเศษอะไรบ้าง? :)


person makemesteaks    schedule 23.06.2014    source แหล่งที่มา
comment
นอกจากนี้ คุณพิมพ์ผิดใน print 'Logest substring... ซึ่งควรจะเป็น Longest (ตามชื่อของคุณ) /nitpicking   -  person Daan Timmer    schedule 23.06.2014


คำตอบ (3)


ปัญหาของคุณอยู่ที่ range(len(s)-1) Range สร้างรายการจนถึงขีดจำกัดบนของค่าพารามิเตอร์ -1 ดังนั้นคุณไม่จำเป็นต้องลบ 1 ถึง len ใช้:

range(len(s))

จาก https://docs.python.org/2/library/functions.html#range

range(stop) range(start, stop[, step]) นี่เป็นฟังก์ชันอเนกประสงค์ในการสร้างรายการที่มีการก้าวหน้าทางคณิตศาสตร์ มักใช้ใน for loops อาร์กิวเมนต์ต้องเป็นจำนวนเต็มธรรมดา หากละเว้นอาร์กิวเมนต์ step จะมีค่าเริ่มต้นเป็น 1 หากละเว้นอาร์กิวเมนต์เริ่มต้น จะมีค่าเริ่มต้นเป็น 0 แบบฟอร์มแบบเต็มจะส่งคืนรายการจำนวนเต็มธรรมดา [start, start + step, start + 2 * step, ...] . หาก step เป็นบวก องค์ประกอบสุดท้ายคือ start + i * step ที่ใหญ่ที่สุดซึ่งน้อยกว่า stop; ถ้า step เป็นลบ องค์ประกอบสุดท้ายคือ start + i * step ที่เล็กที่สุดมากกว่า stop ขั้นตอนจะต้องไม่เป็นศูนย์

ในทางกลับกัน คุณกำลังติดป้ายกำกับคำถามของคุณเป็น python2.7 ดังนั้นฉันคิดว่าคุณใช้ 2.7 หากเป็นกรณีนี้ การใช้ xrange แทน range จะมีประสิทธิภาพมากกว่า เนื่องจากวิธีนี้คุณจะใช้ตัววนซ้ำแทนการสร้างรายการ

แก้ไข

จากความคิดเห็นต่อคำถามนี้ คุณสามารถเปลี่ยนรหัสของคุณเป็น:

s='caabcdab'
sub =''
test =s[0]

for i in range(1,len(s)+1):
    n = i%len(s)
    if len(test) > len(sub):
        sub = test
        if i >= len(s):
            break
    if s[n] >= s[n-1]:
        test += s[n]
    else:
        test = s[n]

print 'Logest substring in alphabetic order is: ' + str(sub)
person Pablo Francisco Pérez Hidalgo    schedule 23.06.2014
comment
ขอบคุณสำหรับคำตอบปาโบล ปัญหาคือไม่ว่าฉันจะพิมพ์ช่วงใด ตัวแปรย่อยที่ฉันจะพิมพ์ ไม่ได้รับตัวอักษรทั้งหมดที่ฉันต้องการ การวนซ้ำจะเสร็จสิ้นก่อน :\ บางทีอาจเป็นปัญหากับตัวโปรแกรมเอง - person makemesteaks; 23.06.2014
comment
@makemesteaks: นั่นเป็นเพราะคุณกำหนดการทดสอบให้กับย่อยก่อนที่มันจะตรวจสอบในลูปให้เสร็จสิ้น ดังนั้นการตรวจสอบครั้งล่าสุดจึงสำเร็จ แต่สตริงที่อัปเดตไม่ได้ถูกกำหนดให้กับย่อย :) - person JRajan; 23.06.2014
comment
@makemesteaks อัลกอริทึมของคุณต้องวนซ้ำอีกหนึ่งอักขระเพื่อให้สามารถกำหนดผลลัพธ์สุดท้ายได้ ลองกับ: for i in range(len(s)+1): n = i%len(s) - person Pablo Francisco Pérez Hidalgo; 23.06.2014
comment
ขอบคุณราจัน! ตรวจสอบคำตอบของฉันด้านล่าง ฉันเพิ่งกำหนดเช็คไว้ที่ส่วนท้ายของลูป ตอนนี้ฉันจะตรวจสอบกับกรณีต่างๆ และจะแจ้งให้คุณทราบ - person makemesteaks; 23.06.2014
comment
ขอบคุณสำหรับความพยายามนะ ถ้าฉันย้าย if len(test) > len(sub): sub = test ไปยังจุดสิ้นสุดของลูป มันจะไม่ทำงานเช่นกัน นอกจากนี้ โค้ดแก้ไขของคุณยังใช้ไม่ได้กับกรณีทดสอบอื่นๆ เช่น: s = 'ocunhyfwiyizqh' ควรเป็น cu และฉันได้รับ oo< /b> เป็นต้น ขอโทษนะทุกคน แต่นี่กลายเป็นความเจ็บปวดในตูด - person makemesteaks; 23.06.2014
comment
ในที่สุด! ขอบคุณ! :) ตอนนี้ฉันจะศึกษารหัสนี้! ขอขอบคุณและมีวันที่ดี - person makemesteaks; 23.06.2014

คุณ enemurate แทนที่จะเป็นช่วง:

 s='abcdefghijklmnopqrstuvwxyz'

sub =''
test =s[0]

for n,value in enumerate(s):
    if len(test) > len(sub):
        sub = test
    if value >= s[n-1]:
        test += s[n]
    else:
        test = s[n]
person sundar nataraj    schedule 23.06.2014

คุณสามารถใช้รหัสต่อไปนี้:

s = 'abcdefgahijkblmnopqrstcuvwxyz'
sub = ''
test = s[0]

for index, character in enumerate(s):
    if index > 0:
        if character > s[index - 1]:
            test += character
        else:
            test = character
    if len(test) > len(sub):
        sub = test
print 'Longest substring in alphabetic order is: ' + str(sub)

พอยน์เตอร์ไม่กี่ตัวเช่นกัน

  1. สตริง Python สามารถทำซ้ำได้ นั่นคือคุณสามารถวนซ้ำพวกมันได้
  2. ใช้การแจงนับเมื่อคุณต้องการดัชนีของรายการในขณะที่วนซ้ำ
person JRajan    schedule 23.06.2014