이 문제에서는 문자열 배열이 주어지고 해당 배열의 모든 아나그램 쌍을 인쇄해야 합니다.
애너그램 다른 문자열의 문자를 재배열하여 형성된 문자열입니다. 좋아요 - 안녕하세요 그리고 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.
이 솔루션은 이해하기 쉽지만 효율성이 떨어집니다. 따라서 솔루션을 보다 효과적으로 만들기 위해 몇 가지 최적화를 수행할 수 있습니다. 문자열을 포함하는 배열을 정렬하여 이를 수행할 수 있습니다. 이 정렬된 배열을 사용하면 아나그램을 더 쉽게 찾을 수 있습니다.