Որոնեք տող առաջին եզակի նիշի համար

Այս հոդվածում մենք կներկայացնենք ալգորիթմի մարտահրավեր, այնուհետև երկու լուծում կտանք՝ երկրորդ տեղը զբաղեցնող և օպտիմալ ալգորիթմ: Ալգորիթմները գրված են Python-ով։

Մարտահրավեր

Գտեք առաջին չկրկնվող նիշը փոքրատառերի շարքում: Չկրկնվողը սահմանվում է որպես նիշ, որը միայն մեկ անգամ է հայտնվում տողում: Եթե ​​բոլոր նիշերը կրկնվում են, վերադարձրեք ընդգծում:

Ահա մի քանի նմուշ տողեր և պատասխաններ յուրաքանչյուրի համար.

"aabcdb" # c
"abcddc" # a
"aabbcc" # _
"abbcda" # c

Այժմ, երբ մենք հասկանում ենք մարտահրավերը, ես կխրախուսեմ ձեզ փորձել ինքնուրույն:

Եթե ​​արդեն փորձել եք կամ ցանկանում եք առաջ անցնել, ապա եկեք գնանք լուծմանը:

Փոխչեմպիոն

Օգտագործելով զույգ for loops, մենք կարող ենք կրկնել տողի վրա ներդիր ձևով՝ որոշելու, թե արդյոք նիշը կրկնվել է.

Այս լուծման վերաբերյալ մի քանի նշում.

  • Nested for loop ալգորիթմը ունի O(n^2) բազմանդամ ժամանակային բարդություն:
  • Օպտիմալացրեք ներկառուցված հանգույցների լուծումները՝ նվազեցնելով ալգորիթմը մինչև մեկ օղակ:

Օպտիմալ լուծում

Ներդրված օղակ չունենալու համար մենք կարող ենք հետևել, թե քանի անգամ է յուրաքանչյուր արժեք գոյություն ունի տողի մեջ՝ օգտագործելով բառարանը  , որտեղ նիշը տերմինն է, իսկ հաշվիչը՝ սահմանումը:

Երբ մենք ունենք մեր հաշվարկները, բառարանը դառնում է հղում, քանի որ մենք ստուգում ենք առաջին նիշը միայն մեկ երևույթով.

Որոշ նշումներ այս լուծման վերաբերյալ.

  • Քանի որ բառարանն ըստ սահմանման դասավորված չէ, մենք պետք է երկրորդ անգամ շրջենք՝ համոզվելու համար, որ պահպանում ենք տողի հաջորդականությունը:
  • Սկսած 3.7 տարբերակից, Python բառարանները կպահպանեն մուտքի կարգը: Սա կվերացնի տողի միջով անցնելու անհրաժեշտությունը և թույլ կտա մեզ ուղղակիորեն կրկնել բառարանի փոխարեն:

Բոնուսային լուծում

Բարեբախտաբար մեզ՝ Pythonistas-ի համար, կան բնիկ լարային ֆունկցիաներ, որոնք այս ալգորիթմը դարձնում են հով:

Օգտագործելով .find()-ը և .rfind()-ը, մենք կարող ենք որոշել նիշի ձախ և աջ ցուցիչը: Եթե ​​ձախ և աջ որոնումները վերադարձնում են նույն ինդեքսը, ապա կարող ենք եզրակացնել, որ կերպարի միայն մեկ երևույթ կա:

def firstNotRepeatingCharacter(my_string):
  for c in my_string:
    if my_string.index(c) == my_string.rindex(c):
      return c
  return "_"

Որոշ նշումներ այս լուծման վերաբերյալ.

  • Քանի որ ալգորիթմը հիմնված է լեզվին հատուկ մեթոդների վրա, այն լեզվաագնոստիկ չէ:
  • Թեև այս ալգորիթմը շարահյուսորեն ավելի քիչ կրկնություն ունի, քան մեր օպտիմալ լուծումը, երկուսն էլ կիսում են նույն ժամանակի բարդությունը:

Եզրակացություն

Ինչպե՞ս ստացվեց ձեզ մոտ: Ո՞րն էր ձեր նախնական լուծումը: Կիսվեք ձեր փորձով ստորև:

Հատուկ շնորհակալություն Nick White-ին այս ալգորիթմի բացատրության համար: