diff --git a/solutions/cpp/anagram/1/anagram.cpp b/solutions/cpp/anagram/1/anagram.cpp new file mode 100644 index 0000000..53caf28 --- /dev/null +++ b/solutions/cpp/anagram/1/anagram.cpp @@ -0,0 +1,53 @@ +#include "anagram.h" +#include +#include + +using namespace std; + +namespace anagram { + +// Convierte un string a minúsculas usando transformaciones +string anagram::to_lowercase(string str) { + transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { + return tolower(c); + }); + return str; +} + +// Constructor: Aplica optimización con pre-calculo +anagram::anagram(const string& target) : m_target_original(target) { + m_target_lowercase = to_lowercase(m_target_original); + m_target_sorted = m_target_lowercase; + sort(m_target_sorted.begin(), m_target_sorted.end()); +} + +vector anagram::matches(const vector& candidates) const { + vector result; + + for (const string& candidate : candidates) { + // Regla 1: Si miden distinto, no pueden ser anagramas + if (candidate.length() != m_target_lowercase.length()) { + continue; + } + + string candidate_lowercase = to_lowercase(candidate); + + // Regla 2: Una misma palabra NO es su propio anagrama + if (candidate_lowercase == m_target_lowercase) { + continue; + } + + // Regla 3: Ordenar la candidata en minúsculas + string candidate_sorted = candidate_lowercase; + sort(candidate_sorted.begin(), candidate_sorted.end()); + + // Si coinciden, es un anagrama legítimo + if (candidate_sorted == m_target_sorted) { + result.push_back(candidate); + } + } + + return result; +} + +} diff --git a/solutions/cpp/anagram/1/anagram.h b/solutions/cpp/anagram/1/anagram.h new file mode 100644 index 0000000..ba9c533 --- /dev/null +++ b/solutions/cpp/anagram/1/anagram.h @@ -0,0 +1,24 @@ +#pragma once +#include +#include + +namespace anagram { + +class anagram { +private: + std::string m_target_original; + std::string m_target_lowercase; + std::string m_target_sorted; + + // Función auxiliar para convertir un string a minúsculas + static std::string to_lowercase(std::string str); + +public: + // El constructor recibe y pre-procesa la palabra objetivo + explicit anagram(const std::string& target); + + // Encuentra y devuelve las candidatas que cumplen + std::vector matches(const std::vector& candidates) const; +}; + +}