#include <string>
#include <unordered_set>
#include <ranges>
 
class Solution {
public:
    std::string longestNiceSubstring(std::string s) {
        if (s.size() < 2) return "";
 
        std::unordered_set<char> chars;
        for (const char& c : s) chars.insert(c);
 
        for (auto const& [idx, c] : std::views::enumerate(s) ) {
            if (
                chars.count(std::tolower(static_cast<unsigned char>(c)))
                &&
                chars.count(std::toupper(static_cast<unsigned char>(c)))
            )
                continue;
            
            std::string left = longestNiceSubstring(s.substr(0, idx));
            std::string right = longestNiceSubstring(s.substr(idx + 1));
 
            return (left.size() >= right.size()) ? left : right;
        }
 
        return s;
    }
};