Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 주어진 문자열 배열의 모든 아나그램 쌍을 인쇄합니다.


이 문제에서는 문자열 배열이 주어지고 해당 배열의 모든 아나그램 쌍을 인쇄해야 합니다.

애너그램 다른 문자열의 문자를 재배열하여 형성된 문자열입니다. 좋아요 - 안녕하세요 그리고 lolhe

문제를 이해하기 위해 예를 들어 보겠습니다 -

Input: array = {“hello”, “hrdef”, “from”, “lohel”, “morf”}.
Output: [hello, lohel] , [from , morf]

이 문제를 해결하기 위해 루프의 중첩을 사용합니다. 두 개의 중첩 루프가 필요합니다. 외부 루프는 배열을 가로질러 요소를 선택합니다. 중첩 루프는 각 문자열을 확인하고 아나그램인지 여부를 확인합니다.

예시

그 알고리즘을 구현하는 프로그램을 보자 -

#include <iostream>
using namespace std;
#define NO_OF_CHARS 256
bool isAnagramString(string str1, string str2){
   int count[NO_OF_CHARS] = {0};
   int i;
   for (i = 0; str1[i] && str2[i]; i++){
      count[str1[i]]++;
      count[str2[i]]--;
   }
   if (str1[i] || str2[i])
      return false;
   for (i = 0; i < NO_OF_CHARS; i++)
      if (count[i])
         return false;
      return true;
}
void printAnagrams(string arr[], int n){
   for (int i = 0; i < n; i++)
      for (int j = i+1; j < n; j++)
         if (isAnagramString(arr[i], arr[j]))
            cout<<arr[i]<<" and "<<arr[j]<<" are anagrams.\n";
}
int main(){
   string arr[] = {"hello", "hrdef", "from", "lohel", "morf"};
   int n = sizeof(arr)/sizeof(arr[0]);
   printAnagrams(arr, n);
   return 0;
}

출력

hello and lohel are anagrams.
from and morf are anagrams.

이 솔루션은 이해하기 쉽지만 효율성이 떨어집니다. 따라서 솔루션을 보다 효과적으로 만들기 위해 몇 가지 최적화를 수행할 수 있습니다. 문자열을 포함하는 배열을 정렬하여 이를 수행할 수 있습니다. 이 정렬된 배열을 사용하면 아나그램을 더 쉽게 찾을 수 있습니다.