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