মডিউল ১৯-৭ঃ পেলিনড্রোম

প্রবলেম লিংকঃ I. Palindrome

প্রবলেম স্টেটমেন্টঃ ইনপুটে একটি স্ট্রিং থাকবে। স্ট্রিংটি পেলিনড্রোম কিনা তা বলতে হবে। সল্যুশনঃ আমরা এটি দুটি ওয়েতে করতে পারি। প্রথমে নরমাল এপ্রোচ। নরমালি পেলিনড্রোম স্ট্রিং বলতে আমরা বুঝি যদি কোন স্ট্রিং রিভার্স করার পরও সেইম থাকে তাহলে সেটি পেলিনড্রোম হয়। আমরা ইনপুট স্ট্রিংটি আরেকটি স্ট্রিং এ কপি করে রেখে তারপর সেই স্ট্রিংটিকে উল্টিয়ে দিতে পারি। তারপর সেই উল্টো স্ট্রিংটির সাথে ইনপুট নেওয়া সোজা স্ট্রিংটি কম্পেয়ার করে দেখতে পারি সেইম কিনা। সেইম হলে পেলিনড্রোম। আর সেইম না হলে পেলিনড্রোম না।

#include<stdio.h>
#include<string.h>
int main()
{
    char a[1001],b[1001];
    scanf("%s",&a);      // স্ট্রিং ইনপুট নিচ্ছি। 
    strcpy(b,a);         // স্ট্রিংটি কপি করে আরেকটি স্ট্রিং এ রেখে দিচ্ছি। 
    int i=0,j=strlen(b)-1;    // দুটি পয়েন্টার নিচ্ছি। একটি স্ট্রিং এর শুরুতে ( ইন্ডেক্স ০ ) আরেকটি শেষে ( ইনডেক্স লেন্থ-১ ) 
    while(i<j)    // যতক্ষন প্রথম পয়েন্টারটি দ্বিতীয় পয়েন্টার থেকে আগে আছে ততক্ষন লুপ চালাচ্ছি।
    {
        char tmp=b[i];  
        b[i]=b[j];     // দুটি পয়েন্টারে থাকা ক্যারেক্টার দুটি সোয়াপ করে দেওয়া হচ্ছে। 
        b[j]=tmp;
        i++;         // প্রথম পয়েন্টারটি এগিয়ে নেওয়া হচ্ছে। 
        j--;         // দ্বিতীয় পয়েন্টারটি পিছিয়ে নেওয়া হচ্ছে। 
    }     // লুপ শেষে সম্পূর্ণ স্ট্রিংটি উল্টিয়ে যাবে।  
    if(strcmp(a,b)==0)      // এবার আমরা উল্টো স্ট্রিং এবং সোজা স্ট্রিং কম্পেয়ার করে দেখছি সেইম কিনা। 
    {
        printf("YES");     // সেইম হলে ইয়েস প্রিন্ট করে দিচ্ছি।
    }
    else 
    {
        printf("NO");     // আর সেইম না হলে নো প্রিন্ট করে দিচ্ছি।
    }
    return 0;
}

দ্বিতীয় সল্যুশনঃ দুটি পয়েন্টার নিয়েও আমরা এটি করতে পারি। তাহলে আমাদের স্ট্রিং উল্টোতে হবে না কম্পেয়ারও করতে হবে না। দুটি পয়েন্টার নিব। একটি স্ট্রিং এর শুরুতে ( ইন্ডেক্স ০ ) আরেকটি শেষে ( ইনডেক্স লেন্থ-১ ) । তারপর দেখব এই দুটি ইন্ডেক্সে থাকা ক্যারেক্টার দুটি সেইম কিনা । সেইম না হলে সাথে সাথে আমরা বলে দিতে পারব এটি পেলিনড্রোম না। এটি ট্র্যাক রাখার জন্য আমরা শুরুতে একটি ফ্ল্যাগ ভেরিয়েবল নিয়ে নিতে পারি এবং তাতে ১ রেখে দিতে পারি। যখনি দেখব ক্যারেক্টার দুটি সেইম না তখনি ফ্ল্যাগ এর মধ্যে ০ রেখে দিব। তারপর লুপ শেষে চেক করে দেখব ফ্ল্যাগ এর মধ্যে আমাদের শুরুতে রাখা ১ আছে কিনা। থাকলে এটি পেলিনড্রোম আর না থাকলে পেলিনড্রোম না।

#include<stdio.h>
#include<string.h>
int main()
{
    char a[1001];
    scanf("%s",a);      // স্ট্রিং ইনপুট নিচ্ছি। 
    int i=0,j=strlen(a)-1;     // দুটি পয়েন্টার নিচ্ছি। একটি স্ট্রিং এর শুরুতে ( ইন্ডেক্স ০ ) আরেকটি শেষে ( ইনডেক্স লেন্থ-১ ) 
    int flag=1;     // শুরুতে একটি ফ্ল্যাগ ভেরিয়েবল নিয়ে তাতে ১ রেখে দিচ্ছি।
    while(i<j)     // যতক্ষন প্রথম পয়েন্টারটি দ্বিতীয় পয়েন্টার থেকে আগে আছে ততক্ষন লুপ চালাচ্ছি।
    {
        if(a[i]!=a[j])  // চেক করে দেখছি  এই দুটি পয়েন্টারে থাকা ক্যারেক্টার দুটি সেইম কিনা । যদি সেইম না হয় তাহলে সাথে সাথে আমরা বলে দিতে পারব এটি পেলিনড্রোম না। 
        { 
            flag=0;     // তখন আমরা ফ্ল্যাগ এর মধ্যে ০ রেখে দিচ্ছি।
        }
        i++;       // প্রথম পয়েন্টারটি এগিয়ে নেওয়া হচ্ছে। 
        j--;       // দ্বিতীয় পয়েন্টারটি পিছিয়ে নেওয়া হচ্ছে। 
    }
    if(flag==0)    // লুপ শেষে চেক করে দেখছি ফ্ল্যাগ এর মধ্যে আমাদের শুরুতে রাখা ১ আছে নাকি ফ্ল্যাগ এর ভেলু চেঞ্জ হয়ে ০ হয়ে গিয়েছে। 
    {
        printf("NO");    // যদি ০ হয়ে যায় তাহলে এটি পেলিনড্রোম না।
    }
    else 
    {
        printf("YES");    // আর যদি ১ থাকে তাহলে এটি একটি পেলিনড্রোম স্ট্রিং।
    }
    return 0;
}

গিটবুক গুলো আপনাদের কেমন লাগছে? এই ফর্মটি ফিলাপ করে আমাদের জানাতে পারেন। https://forms.gle/VaLLNgM2cWHzsuRV8

Last updated