'''
Given a 0-indexed string s, permute s to get a new string t such that:

All consonants remain in their original places. More formally, if there is an index i with 0 <= i < s.length such that s[i] is a consonant, then t[i] = s[i].
The vowels must be sorted in the nondecreasing order of their ASCII values. More formally, for pairs of indices i, j with 0 <= i < j < s.length such that s[i] and s[j] are vowels, then t[i] must not have a higher ASCII value than t[j].
Return the resulting string.

The vowels are 'a', 'e', 'i', 'o', and 'u', and they can appear in lowercase or uppercase. Consonants comprise all letters that are not vowels.



Example 1:

Input: s = "lEetcOde"
Output: "lEOtcede"
Explanation: 'E', 'O', and 'e' are the vowels in s; 'l', 't', 'c', and 'd' are all consonants. The vowels are sorted according to their ASCII values, and the consonants remain in the same places.
Example 2:

Input: s = "lYmpH"
Output: "lYmpH"
Explanation: There are no vowels in s (all characters in s are consonants), so we return "lYmpH".


Constraints:

1 <= s.length <= 105
s consists only of letters of the English alphabet in uppercase and lowercase.
'''

from typing import *

import unittest


class Solution:
    def sortVowels(self, s: str) -> str:
        all_vowels = ('a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U')
        pos = []
        vowels = []
        res = []
        for i in range(len(s)):
            if s[i] in all_vowels:
                pos.append(i)
                vowels.append(s[i])
            res.append(s[i])

        vowels.sort()
        for i, d in enumerate(pos):
            res[d] = vowels[i]
        return ''.join(res)


class TestSolution(unittest.TestCase):
    def test_case(self):
        examples = (
            (("lEetcOde",), "lEOtcede"),
        )
        for first, second in examples:
            self.assert_function(first, second)

    def assert_function(self, first, second):
        self.assertEqual(Solution().sortVowels(*first), second,
                         msg="first: {}; second: {}".format(first, second))


unittest.main()

