C++ 中给定数组中的第一个字符串,其反向也存在于同一数组中

c++server side programmingprogramming更新于 2025/5/31 8:22:17

在这个问题中,我们给出了一个大小为 N 的字符串 str[] 数组。我们的任务是创建一个程序,用于从给定数组中查找第一个字符串,其反向也存在于同一数组中

让我们举一个例子来理解这个问题,

输入:str[] = ["python", "program", "C#", "language", "#C"]
输出:C#

解决方法

解决问题的一种方法是直接遍历字符串数组的每个元素并检查剩余数组中字符串的反向。如果找到反向字符串,则返回字符串。如果遍历整个数组并且未找到具有反向字符串,则返回 -1

示例

程序用于说明我们的解决方案的工作原理

#include<iostream>
#include<string.h>
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);
}

输出

数组中反转的字符串是 C#

另一种可以在线性时间内(即单次遍历)解决问题的方法是使用 hashmap。我们将每个单词存储在 hashmap 中。如果任何字符串在 hashmap 中存在其反向,则 hashmap 中的反向字符串就是我们的结果。如果整个数组不包含任何这样的字符串,则返回 -1。

示例

程序来说明我们的解决方案的工作原理

#include<bits/stdc++.h>
using namespace std;
string checkRevStringArr(string strArr[], int length){
   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() and 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);
}

输出

数组中反转的字符串是 C#

相关文章