প্যালিনড্রোম (Palindrome) কি?
প্যালিনড্রোম হলো একটি স্ট্রিং যা বাম থেকে ডানে পড়লে এবং ডান থেকে বামে পড়লে একই থাকে। অন্য কথায়, একটি প্যালিনড্রোম স্ট্রিং হলো যেটির রিভার্স (reverse) মূল স্ট্রিংয়ের সমান।
উদাহরণস্বরূপ, civic, madam প্যালিনড্রোম।
Cat প্যালিনড্রোম নয়। কারণ এর রিভার্স tac, যা মূল স্ট্রিং (cat) এর সমান নয়।
একটি প্রোগ্রাম লিখুন যা ইনপুট স্ট্রিংটি প্যালিনড্রোম কিনা তা বের করবে।
পদ্ধতি ১ - স্ট্রিংর রিভার্স বের করে
প্রোগ্রামে প্রধান דרישה হলো স্ট্রিংর রিভার্স বের করা।
রিভার্স স্ট্রিং রিভার্স করার যেকোনো পদ্ধতি দিয়ে বের করা যায়। আমরা সিম্পল স্লাইসিং (slicing) মেথড ব্যবহার করব স্ট্রিং রিভার্স করার জন্য। ইনবিল্ট
''.join(reversed())ও ব্যবহার করা যেতে পারে। যদিও স্ট্রিং রিভার্স করার অন্যান্য উপায় আছে, আমরা একটি সহজটি ব্যবহার করব।রিভার্স করা স্ট্রিংটি মূল স্ট্রিংয়ের সাথে তুলনা করুন।
দুটি স্ট্রিং সমান হলে
Trueরিটার্ন করুন, অন্যথায়False।
উদাহরণ
def isPalindrome(s):
rev = s[::-1]
if rev == s:
return True
return False
print("Enter a string")
st = input()
print(isPalindrome(st))
আউটপুট
Enter a string madam True
পদ্ধতি ২ - স্ট্রিংর রিভার্স বের না করেই
আইডিয়া হলো স্ট্রিংর প্রথম এবং শেষ ইনডেক্সের ক্যারেক্টারগুলো liên tục তুলনা করা যতক্ষণ না তারা অন برابر হয়।
আমরা রিভার্স বের না করে দুটি উদাহরণ দেখব:
স্ট্রিং ভ্যালু "madam":
আমরা প্রথম এবং শেষ ক্যারেক্টার তুলনা করি যেগুলো সমান, আরও আমরা সেকেন্ড এবং সেকেন্ড লাস্ট ক্যারেক্টার তুলনা করি যেগুলো আবার সমান। শেষে আমরা শুধু একটি ক্যারেক্টারতে থাকি। অতএব, স্ট্রিংটি একটি প্যালিনড্রোম।
স্ট্রিং ভ্যালু "reader":
ক্যারেক্টারগুলো সেকেন্ড এবং সেকেন্ড লাস্ট এলিমেন্টের তুলনা পর্যন্ত সমান।
যখন থার্ড এবং থার্ড লাস্ট ক্যারেক্টার তুলনা করা হয়, তারা সমান নয়, অতএব এটি প্যালিনড্রোম নয়।
আমরা এই আইডিয়া রিকার্শন (recursion) বা টু পয়েন্টার (two pointers) দিয়ে ইমপ্লিমেন্ট করতে পারি। আমরা টু পয়েন্টার ব্যবহার করব। আমরা স্টার্ট পয়েন্টার ০ এবং এন্ড পয়েন্টার লাস্ট ইনডেক্সে শুরু করব। আমরা তুলনা শুরু করব এবং যদি ক্যারেক্টারগুলো সমান হয়, তবে আমরা স্টার্ট পয়েন্টার ইনক্রিমেন্ট করব এবং এন্ড পয়েন্টার ডিক্রিমেন্ট করব (এভাবে সেকেন্ড এবং সেকেন্ড লাস্ট ক্যারেক্টারে এসে যাব এবং এভাবে চলে)।
কখন
Falseরিটার্ন করব? যদি আমরা পাই যে কোনো পয়েন্টার সেটের জন্য ক্যারেক্টারগুলো সমান নয়, তবে আমাদের ফারদার ইনডেক্সে তাকাতে হবে না এবং আমরাFalseরিটার্ন করতে পারি।কখন
Trueরিটার্ন করব? অন্য ক্ষেত্রে, যদি স্ট্রিং প্যালিনড্রোম হয়, তবে আমরাTrueরিটার্ন করব যখন দুটি পয়েন্টার সমান হয়ে যাবে (শুধু ১ ক্যারেক্টার চেক করার জন্য বাকি থাকে) বা স্টার্ট পয়েন্টার এন্ড পয়েন্টারকে একসিড (exceed) করবে (সব ক্যারেক্টার চেক হয়ে গেলে) এবং তাইTrueরিটার্ন করব।
উদাহরণ
def isPalindrome(s):
rev = s[::-1]
if rev == s:
return True
return False
print("Enter a string")
st = input()
print(isPalindrome(st))
আউটপুট
Enter a string reader False >>> Enter a string madam True