प्रोग्रामिंगमधील काही समस्यांना क्लासिकची स्थिती असते. सामान्यतः, अशी कार्ये गणिताशी संबंधित असतात आणि त्यांना कॉम्प्युटर सायन्सच्या विद्यार्थ्यांना, तसेच नोकरी शोधणार्‍यांना मुलाखतींमध्ये विचारणे खूप आवडते. ते चांगले आहेत कारण ते प्रोग्रामर मार्गाने तुमची विचारसरणी व्यवस्थित ठेवण्यास मदत करतात, तसेच प्रशिक्षण देतात. अशा समस्यांपैकी एक म्हणजे स्ट्रिंग पॅलिंड्रोम आहे की नाही हे तपासणे आणि आम्ही या लेखात त्याचा विचार करणार आहोत.

पॅलिंड्रोम म्हणजे काय आणि ते का शोधता येईल

पॅलिंड्रोम एक संख्या, अक्षर संयोजन, शब्द किंवा मजकूर आहे जो दोन्ही दिशांनी समान वाचतो. थोडक्यात, पॅलिंड्रोमला त्याच्या मध्यभागी सममितीय वर्णांचा कोणताही संच म्हणता येईल. हा शब्द ग्रीक मुळातून आला आहे ज्याचा शब्दशः अर्थ “पळणे” (पॅलिन म्हणजे “पुन्हा, मागे” आणि ड्रोमोस, “धावणे.”). जावा मधील पॅलिंड्रोम म्हणजे सामान्य अर्थाप्रमाणेच. पॅलिंड्रोमची उदाहरणे:
  • १८८१
  • aaqquqqaa
  • पॉप
  • दुपार
  • पातळी
  • रोटेटर
  • माझी जिम
  • मॅडम मी अॅडम आहे
  • आता साहेब, युद्ध जिंकले!
1881 हा पॅलिंड्रोम नंबर आहे आणि इतर पॅलिंड्रोम स्ट्रिंग आहेत. या लेखात, आम्ही स्ट्रिंग म्हणून दर्शविल्या जाणार्‍या पॅलिंड्रोम्सकडे पाहणार आहोत, परंतु काही अल्गोरिदम Java मधील इतर प्रकारच्या पॅलिंड्रोमसाठी लागू आहेत. तुम्हाला पॅलिंड्रोम्स का शोधायचे आहेत? खरं तर, आपल्याला दैनंदिन जीवनात पॅलिंड्रोम शोधण्याची गरज नसते. हे एक अतिशय विशिष्ट कार्य आहे. जर आपल्याला स्ट्रिंग अल्गोरिदम आठवत असेल तर, अधिक वेळा व्यवहारात, प्रोग्रामर स्ट्रिंगमध्ये सबस्ट्रिंग शोधताना शोधू शकतात आणि पॅलिंड्रोम किंवा त्यांची संख्या शोधत नाहीत. तथापि, पॅलिंड्रोमशी संबंधित समस्यांमध्ये महत्त्वपूर्ण अनुप्रयोग आहेत. पहिले ऑलिम्पियाड प्रोग्रामिंग आहे. पॅलिंड्रोम ओळखण्यासाठी कार्ये असू शकतात. दुसरा अनुप्रयोग जो नवशिक्या प्रोग्रामरसाठी संबंधित आहे तो मुलाखत आहे. एका तांत्रिक मुलाखतीत, स्ट्रिंग पॅलिंड्रोम आहे की नाही हे तपासण्यासाठी तुम्हाला त्वरीत प्रोग्राम लिहिण्यास सांगितले जाईल, कदाचित कागदाच्या तुकड्यावरही. बरं, विज्ञानात, पॅलिंड्रोम शोधण्याचा सर्वात व्यावहारिक उपयोग म्हणजे जैविक अल्गोरिदम. विकिपीडियाच्या मते, विविध जैविक संयुगांच्या गुणधर्मांमध्ये जैविक संयुगांची पॅलिंड्रोमिसिटी महत्त्वाची भूमिका बजावते.

पॅलिंड्रोम अल्गोरिदम कोड उदाहरण

चला विचार करूया. स्ट्रिंग हा वर्णांचा क्रम आहे, कोणी म्हणू शकेल, चारचा एक अॅरे. हा क्रम दोन्ही बाजूंपासून मध्यापर्यंत पाळणे आणि टोकाच्या वर्णांची तुलना करणे सर्वात तर्कसंगत असेल. जर आपण मध्यभागी पोहोचेपर्यंत आपली सर्व वर्ण जुळत असतील, तर आपल्याला पॅलिंड्रोम आहे. स्ट्रिंग पॅलिंड्रोम आहे की नाही हे तपासण्यासाठी एक बुलियन पद्धत validPalindrome(Strings) बनवू. जावा कोड येथे आहे:

public class PalindromeTest1 {

//method to check if a string is palindrome    
public static boolean validPalindrome(String s) {
       for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
           if (s.charAt(i) != s.charAt(j)) {
               return false;
           }
       }
       return true;
   }

   public static void main(String[] args) {
       String s1 = "level";
       String s2 = "cool";
       String s3 = "Madam";
       String s4 = "Now, sir, a war is won!"
       boolean b1 = validPalindrome(s1);
       boolean b2 = validPalindrome(s2);
       boolean b3 = validPalindrome(s3);
       boolean b4 = validPalindrome(s4);
       System.out.println("is " + s1 + " a palindrome? " + b1);
       System.out.println("is " + s2 + " a palindrome? " + b2);
       System.out.println("is " + s3 + " a palindrome? " + b3);
       System.out.println("is " + s4 + " a palindrome? " + b4);


   }

}
मुख्य पद्धतीमध्ये, आम्ही पॅलिंड्रोमिक स्ट्रिंग्स “लेव्हल”, “कूल”, “मॅडम” आणि “आता, सर, युद्ध जिंकले आहे!” तपासतो. जसे आपण पाहू शकता, पहिला, तिसरा आणि चौथा पॅलिंड्रोम आहेत, परंतु दुसरा नाही. कार्यक्रम काय देईल?
पातळी एक palindrome आहे? थंड एक पॅलिंड्रोम खरे आहे? खोटे मॅडम पॅलिंड्रोम आहे का? खोटे आहे आता सर, युद्ध जिंकले आहे! पॅलिंड्रोम? खोटे
तर, पहिला पॅलिंड्रोम आहे, दुसरा नाही. मात्र, तिसर्‍या आणि चौथ्याचे काय चुकले? निकाल खोटा का आहे ? तुम्ही कदाचित आधीच अंदाज लावला असेल की या स्ट्रिंगमधील काही अक्षरे अपरकेस आहेत आणि काही लोअरकेस आहेत आणि Java साठी M आणि m ही दोन भिन्न वर्ण आहेत. हा फरक लक्षात घेऊन कार्यक्रमात सुधारणा करूया. अप्पर आणि लोअरकेस समस्या सोडवणारी स्ट्रिंग पॅलिंड्रोम आहे की नाही हे तपासण्यासाठी येथे एक प्रोग्राम आहे.

public class PalindromeTest2 {

   //lowercase and uppercase characters should be treated the same:
   public static boolean validPalindrome(String s) {
       for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
           if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j)))
               return false;
       }
       return true;
   }

   public static void main(String[] args) {
       String s1 = "level";
       String s2 = "cool";
       String s3 = "Madam";
        String s4 = "Now, sir, a war is won!"
       boolean b1 = validPalindrome(s1);
       boolean b2 = validPalindrome(s2);
       boolean b3 = validPalindrome(s3);
       boolean b4 = validPalindrome(s4);
       System.out.println("is " + s1 + " a palindrome? " + b1);
       System.out.println("is " + s2 + " a palindrome? " + b2);
       System.out.println("is " + s3 + " a palindrome? " + b3);
       System.out.println("is " + s4 + " a palindrome? " + b4);


   }

}
यावेळी निकाल आमच्यासाठी अधिक अंदाजे आहे:
पातळी एक palindrome आहे? थंड एक पॅलिंड्रोम खरे आहे? खोटे मॅडम पॅलिंड्रोम आहे का? आता खरे आहे, सर, युद्ध जिंकले आहे! पॅलिंड्रोम? खोटे
बरं... नक्की अंदाज नाही. "मॅडम" ची परिस्थिती चांगली होत आहे, परंतु आमच्या लांब आणि आनंदी पॅलिंड्रोमचे काय "आता, सर, युद्ध जिंकले आहे!". हे अगदी सोपे आहे, जर तुम्हाला आठवत असेल की सर्व स्पेस आणि विरामचिन्हे Java साठी अक्षरे सारखीच आहेत. त्यामुळे हे निरीक्षण दुरुस्त करण्यासाठी आम्हाला आमचे अल्गोरिदम पुन्हा सुधारण्याची गरज आहे. चला आमच्या प्रोग्रामला स्पेस आणि विरामचिन्हांकडे दुर्लक्ष करायला शिकवूया. सोप्या भाषेत सांगायचे तर, आम्ही सर्व नॉन-अल्फान्यूमेरिक वर्णांकडे दुर्लक्ष करतो. जावा मधील सुधारित पॅलिंड्रोम प्रोग्राम येथे आहे.

public class PalindromeTest3 {

   //in addition to the above, ignore all non alphanumeric chars like punctuation and spaces
   private static boolean isAlphanumeric(char c) {
       return Character.isAlphabetic(c) || Character.isDigit(c);
   }

   public static boolean validPalindromeIgnorePunctuation(String s) {
       for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
           // skip chars we should ignore
           while (j >= 0 && !isAlphanumeric(s.charAt(j))) j--;
           while (i < s.length() && !isAlphanumeric(s.charAt(i))) i++;
           // overskipped -> nothing left to validate
           if (i >= j) return true;

           if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j)))
               return false;
       }
       return true;
   }


   public static void main(String[] args) {
       String s1 = "level";
       String s2 = "cool";
       String s3 = "Madam";
       String s4 = "Now, sir, a war is won!";
       boolean b1 = validPalindromeIgnorePunctuation(s1);
       boolean b2 = validPalindromeIgnorePunctuation(s2);
       boolean b3 = validPalindromeIgnorePunctuation(s3);
       boolean b4 = validPalindromeIgnorePunctuation(s4);
       System.out.println("is " + s1 + " a palindrome? " + b1);
       System.out.println("is " + s2 + " a palindrome? " + b2);
       System.out.println("is " + s3 + " a palindrome? " + b3);
       System.out.println("is " + s4 + " a palindrome? " + b4);


   }

}
किमान परिणाम आम्हाला त्याच्याकडून अपेक्षित आहे:
पातळी एक palindrome आहे? थंड एक पॅलिंड्रोम खरे आहे? खोटे मॅडम पॅलिंड्रोम आहे का? आता खरे आहे, सर, युद्ध जिंकले आहे! पॅलिंड्रोम? खरे
कदाचित, जर तुम्ही नुकतेच प्रोग्राम सुरू करत असाल, तर स्ट्रिंग ट्रॅव्हर्सल आणि तुलना अल्गोरिदम कसे कार्य करतात हे समजणे तुमच्यासाठी कठीण आहे. अर्थात, यास सामोरे जाणे चांगले आहे, परंतु आपण अक्षरांच्या अॅरेद्वारे अगदी पॅसेजची एक सरलीकृत आवृत्ती लिहू शकता, जी खरं तर एक स्ट्रिंग आहे. स्ट्रिंग पॅलिंड्रोम आहे की नाही हे तपासण्यासाठी तुम्ही StringBuffer.reverse पद्धत वापरू शकता. नॉन-अल्फान्यूमेरिक चिन्हे आणि अप्पर आणि लोअरकेस न तपासता सर्वात सोपी आवृत्ती करूया.

public class PalindromeTest5 {

   public static boolean validPalindrome(String s) {

       StringBuffer buffer = new StringBuffer(s);
       buffer.reverse();
       String data = buffer.toString();

       if (s.equals(data)) {
           return true;
       }
       return false;
   }
   public static void main(String[] args) {
       String s1 = "level";
       String s2 = "cool";
       String s3 = "Madam";
       String s4 = "Now, sir, a war is won!";
       boolean b1 = validPalindrome(s1);
       boolean b2 = validPalindrome(s2);
       boolean b3 = validPalindrome(s3);
       boolean b4 = validPalindrome(s4);
       System.out.println("is " + s1 + " a palindrome? " + b1);
       System.out.println("is " + s2 + " a palindrome? " + b2);
       System.out.println("is " + s3 + " a palindrome? " + b3);
       System.out.println("is " + s4 + " a palindrome? " + b4);


   }
}
परिणाम पहिल्या उदाहरणाप्रमाणेच आहे
पातळी एक palindrome आहे? थंड एक पॅलिंड्रोम खरे आहे? खोटे मॅडम पॅलिंड्रोम आहे का? खोटे आहे आता सर, युद्ध जिंकले आहे! पॅलिंड्रोम? खोटे
आपण इच्छित असल्यास, आपण या प्रोग्राममध्ये सुधारणा करू शकता जसे की आम्ही पहिल्या उदाहरणासह केले. तुम्ही जे शिकलात ते बळकट करण्यासाठी, आम्ही तुम्हाला आमच्या Java कोर्समधील व्हिडिओ धडा पाहण्याची सूचना देतो