<p>A string <code>s</code> is <strong>nice</strong> if, for every letter of the alphabet that <code>s</code> contains, it appears <strong>both</strong> in uppercase and lowercase. For example, <code>&quot;abABB&quot;</code> is nice because <code>&#39;A&#39;</code> and <code>&#39;a&#39;</code> appear, and <code>&#39;B&#39;</code> and <code>&#39;b&#39;</code> appear. However, <code>&quot;abA&quot;</code> is not because <code>&#39;b&#39;</code> appears, but <code>&#39;B&#39;</code> does not.</p>

<p>Given a string <code>s</code>, return <em>the longest <strong>substring</strong> of <code>s</code> that is <strong>nice</strong>. If there are multiple, return the substring of the <strong>earliest</strong> occurrence. If there are none, return an empty string</em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;YazaAay&quot;
<strong>Output:</strong> &quot;aAa&quot;
<strong>Explanation: </strong>&quot;aAa&quot; is a nice string because &#39;A/a&#39; is the only letter of the alphabet in s, and both &#39;A&#39; and &#39;a&#39; appear.
&quot;aAa&quot; is the longest nice substring.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;Bb&quot;
<strong>Output:</strong> &quot;Bb&quot;
<strong>Explanation:</strong> &quot;Bb&quot; is a nice string because both &#39;B&#39; and &#39;b&#39; appear. The whole string is a substring.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;c&quot;
<strong>Output:</strong> &quot;&quot;
<strong>Explanation:</strong> There are no nice substrings.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= s.length &lt;= 100</code></li>
	<li><code>s</code> consists of uppercase and lowercase English letters.</li>
</ul>

class Solution:
    #s мөрийг оролт болгон авч хамгийн урт дэд мөрийг буцаадаг үндсэн функц юм.
    def longestNiceSubstring(self, s: str) -> str:
        #_longestNiceSubstring  функцийг дуудна. Энэ нь 0 индексээс эхэлж len(s)-д төгсдөг (бүх мөр).
        sub = self._longestNiceSubstring(s, 0, len(s))
        return s[sub[0]:sub[1]]
    #s тэмдэгтийн зүүн ба баруун талын индексүүдийн хоорондох хамгийн урт дэд мөрийг 
    def _longestNiceSubstring(self, s: str, left: int, right: int) -> list:
        #тухайн дэд мөрөнд байгаа жижиг ба том үсэг хоёуланг нь агуулна.
        char_set = self._getCharSet(s, left, right)
# char_set-д s[i]-ийн жижиг болон том үсгийн хувилбарууд байгаа эсэхийг шалгадаг. 
        for i in range(left, right):
            if s[i].lower() not in char_set or s[i].upper() not in char_set:
                prefix = self._longestNiceSubstring(s, left, i)
                suffix = self._longestNiceSubstring(s, i + 1, right)
                return prefix if prefix[1] - prefix[0] >= suffix[1] - suffix[0] else suffix
#Prefix болон suffix хэсгүүдэд байгаа  дэд мөрүүдийн уртыг харьцуулна.
# Хоёр дэд мөрийн уртыг буцаана. Хэрэв тэдгээр нь ижил урттай бол угтварыг буцаана.
        return [left, right]
#үх тэмдэгтүүд нь том, жижиг үсгээр бичсэн хувилбартай бол) индексийг буцаана
    def _getCharSet(self, s: str, left: int, right: int) -> set:
        char_set = set()
        for i in range(left, right):
            char_set.add(s[i])
        return char_set
#Дэд мөрийн тэмдэгтүүдийг хадгалах хоосон багцыг эхлүүлнэ.
#s[i] тэмдэгт бүрийг char_set-д нэмнэ.
# Example usage
solution = Solution()
s = "YazaAay"
print("Longest nice substring:", solution.longestNiceSubstring(s))  # Output: "aAa"

36