ठीक है! मेरा दूसरा प्रयास यहाँ है।
विचार यह है कि हम यह जानना चाहते हैं कि स्ट्रिंड्रोम को पूरा करने के लिए अतिरिक्त वर्णों को जोड़ते समय स्ट्रिंग के अंत में कितने वर्णों का पुन: उपयोग किया जा सकता है। ऐसा करने के लिए, हम KMP स्ट्रिंग मिलान एल्गोरिदम के एक संशोधन का उपयोग करेंगे। केएमपी का उपयोग करके, हम मूल स्ट्रिंग को इसके विपरीत के लिए खोजते हैं। एक बार जब हम स्ट्रिंग के बहुत अंत तक पहुंच जाएंगे, तो स्ट्रिंग के विपरीत और स्ट्रिंग के अंत में होने वाली मूल स्ट्रिंग के बीच जितना संभव हो उतना मैच होगा। उदाहरण के लिए:
HELLO
O
1010
010
3202
202
1001
1001
इस बिंदु पर, KMP सामान्य रूप से कह सकते हैं कि "कोई मुकाबला नहीं" जब तक मूल स्ट्रिंग विलोमपद था। हालांकि, चूंकि हम वर्तमान में जानते हैं कि स्ट्रिंग का रिवर्स कितना मिलान किया गया था, हम इसके बजाय यह पता लगा सकते हैं कि कितने अक्षर अभी भी गायब हैं और फिर स्ट्रिंग के अंत तक उन्हें ट्रेस करें। पहले मामले में, हम LLEH
खो रहे हैं। दूसरे मामले में, हम 1
खो रहे हैं। तीसरे में, हम खो रहे हैं। अंतिम मामले में, हम कुछ भी याद नहीं कर रहे हैं, क्योंकि प्रारंभिक स्ट्रिंग एक पालिंड्रोम है।
इस एल्गोरिदम का रनटाइम एक मानक केएमपी खोज का रनटाइम है और स्ट्रिंग को उलट करने के लिए आवश्यक समय है: ओ (एन) + ओ (एन) = ओ (एन)।
तो अब शुद्धता का बहस करने के लिए। इसे कुछ प्रयास की आवश्यकता होगी। इष्टतम जवाब पर विचार करें:
| original string | | extra characters |
मान लेते हैं कि हम अंत है, जिसका अर्थ है कि हम मूल स्ट्रिंग के कम से कम रिवर्स पढ़ेंगे से इस पिछड़े पढ़ रहे हैं। इस उलटा स्ट्रिंग का हिस्सा पीछे की ओर मूल स्ट्रिंग के शरीर में फैला हुआ है। वास्तव में, जोड़े गए वर्णों की संख्या को कम करने के लिए, यह वर्णों की सबसे बड़ी संख्या होनी चाहिए जो स्ट्रिंग में वापस आती हैं। हम इसे यहां देख सकते हैं:
| original string | | extra characters |
| overlap |
अब, हमारे केएमपी चरण में क्या होता है? खैर, जब अंदर स्ट्रिंग के विपरीत की तलाश में है, तो केएमपी हर समय जितना संभव हो सके मैच को तब तक रखेगा जब यह स्ट्रिंग में काम करता है। इसका मतलब यह है कि जब केएमपी स्ट्रिंग के अंत को हिट करता है, तो यह मिलान किया गया मिलान वाला हिस्सा सबसे लंबा संभव मैच होगा, क्योंकि केएमपी केवल उम्मीदवार के शुरुआती बिंदु को विफलता पर आगे बढ़ाता है। नतीजतन, हमारे पास यह सबसे लंबा संभव ओवरलैप है, इसलिए हमें अंत में आवश्यक वर्णों की सबसे कम संभव संख्या मिल जाएगी।
मुझे 100% यकीन नहीं है कि यह काम करता है, लेकिन ऐसा लगता है कि हर मामले में मैं इसे फेंक सकता हूं। शुद्धता प्रमाण उचित लगता है, लेकिन यह थोड़ा सा हाथ है क्योंकि औपचारिक केएमपी आधारित सबूत शायद थोड़ा मुश्किल होगा।
आशा है कि इससे मदद मिलती है!
सबसे आसान तरीका सिर्फ 'str + str.reverse() 'है। लेकिन मुझे संदेह है कि न्यूनतम –
है और निर्देश संघर्ष: शब्द में कहीं भी! = केवल –
@RobotWoods संलग्न करें .. आइए कहें कि हम केवल उन्हें जोड़ सकते हैं .. अब कोई विचार है ?? –