Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में सरणी से पहला स्ट्रिंग जिसका उल्टा भी उसी सरणी में मौजूद हो

समस्या विवरण

इस समस्या में, हमें आकार N की स्ट्रिंग सरणी str[] दी गई है। हमारा कार्य दिए गए सरणी से पहला स्ट्रिंग खोजने के लिए एक प्रोग्राम बनाना है जिसका उल्टा भी उसी सरणी में मौजूद हो।

उदाहरण

इनपुट: str[] = ["python", "program", "C#", "language", "#C"]
आउटपुट: C#

हल का दृष्टिकोण

विधि 1: नेस्टेड लूप (O(N² × L))

समस्या को हल करने का एक तरीका स्ट्रिंग सरणी के प्रत्येक तत्व को सीधे पार करना और शेष सरणी में स्ट्रिंग के उल्टे की जांच करना है। यदि उल्टा मिल जाए तो स्ट्रिंग वापस करें। यदि पूरी सरणी पार हो गई और उल्टा मौजूद वाला कोई स्ट्रिंग नहीं मिला तो -1 वापस करें।

#include <iostream> 
#include <string> 
#include <algorithm> 
using namespace std; 

bool checkStringRev(string s1, string s2) {
    if (s1.length() != s2.length()) return false;
    int len = s1.length();
    for (int i = 0; i < len; i++)
        if (s1[i] != s2[len - i - 1]) return false;
    return true;
}

string checkRevStringArr(string strArr[], int n) {
    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j < n; j++)
            if (checkStringRev(strArr[i], strArr[j]))
                return strArr[i];
    return "-1";
}

int main() {
    string strArr[] = {"python", "program", "C#", "language", "#C"};
    int n = sizeof(strArr) / sizeof(strArr[0]);
    cout << "सरणी से वह स्ट्रिंग जिसका उल्टा सरणी में मौजूद है: " 
         << checkRevStringArr(strArr, n);
    return 0;
}

विधि 2: हैशमैप (O(N × L)) - इष्टतम

एक और विधि जो रैखिक समय में यानी एकल पार में समस्या को हल कर सकती है, हैशमैप का उपयोग करना है। हम हैशमैप में प्रत्येक शब्द संग्रहीत करेंगे। यदि किसी स्ट्रिंग का उल्टा हैशमैप में मौजूद है तो हैशमैप से उल्टी स्ट्रिंग हमारा परिणाम है। और यदि पूरी सरणी में ऐसा कोई स्ट्रिंग नहीं है, तो -1 वापस करें।

#include <bits/stdc++.h> 
using namespace std; 

string checkRevStringArr(string strArr[], int length) {
    unordered_map<string, bool> stringHashMap;
    
    for (int i = 0; i < length; i++) {
        string str = strArr[i];
        reverse(str.begin(), str.end());
        if (stringHashMap.find(str) != stringHashMap.end() && stringHashMap[str])
            return str;
        else
            stringHashMap[strArr[i]] = true;
    }
    return "-1";
}

int main() {
    string strArr[] = {"python", "program", "C#", "language", "#C"};
    int n = sizeof(strArr) / sizeof(strArr[0]);
    cout << "सरणी से वह स्ट्रिंग जिसका उल्टा सरणी में मौजूद है: " 
         << checkRevStringArr(strArr, n);
    return 0;
}

आउटपुट

सरणी से वह स्ट्रिंग जिसका उल्टा सरणी में मौजूद है: C#

जटिलता विश्लेषण

विधिसमय जटिलतास्पेस जटिलता
नेस्टेड लूपO(N² × L)O(1)
हैशमैपO(N × L)O(N × L)

जहां L औसत स्ट्रिंग लंबाई है।

  1. - C++ में K तत्व जोड़कर ऐरे की माध्यिका को अधिकतम करना

    समस्या कथन N तत्वों का एक ऐरे arr[] और एक पूर्णांक K दिया गया है जहां K < N। कार्य उसी ऐरे में K पूर्णांक तत्व डालना है ताकि परिणामी ऐरे की माध्यिका अधिकतम हो। यदि इनपुट ऐरे है {1, 3, 2, 5} और k = 3 तो: सॉर्टेड ऐरे बन जाता है {1, 2, 3, 5} 5 से बड़े 3 तत्व डालें। इस ऑपरेशन के बाद ऐरे बन जाता है {1

  1. - C++ में पॉइंटर का उपयोग करके स्ट्रिंग रिवर्स

    यह आलेख C++ कोडिंग में पॉइंटर का उपयोग करके एक स्ट्रिंग को रिवर्स करता है, पहले यह स्ट्रिंग के पॉइंटर की लंबाई की गणना करता है फिर रिवर्स स्ट्रिंग प्रदर्शित करने के लिए डिक्रीमेंट क्रम में फॉर लूप चलाता है;उदाहरण#include <string.h> #include <iostream> using namespace std; int main(){ &nb

  1. - C++ प्रोग्राम: दी गई स्ट्रिंग में "1(0+)1" के सभी पैटर्न ज्ञात करना

    मान लें किसी स्ट्रिंग में 1(0+)1 जैसे पैटर्न हैं। जहां (0+) 1 की गैर-खाली लगातार घटनाओं को इंगित करता है। हमें सभी पैटर्न ज्ञात करने हैं। पैटर्न ओवरलैप हो सकते हैं। स्ट्रिंग आवश्यक रूप से बाइनरी स्ट्रिंग नहीं है। यह केवल अंक और लोअरकेस वर्ण रख सकती है। मान लें स्ट्रिंग 1101001 की तरह है, तो ऐसे दो प