【力扣题解 Day 6】1061. 按字典序排列最小的等效字符串

【力扣题解 Day 6】1061. 按字典序排列最小的等效字符串

  • 问题
  • 思路
  • 解题过程
  • 复杂度
  • Code

问题

Problem: 1061. 按字典序排列最小的等效字符串

思路

模拟

解题过程

并查集是更好的做法,希望下次能用上。

对于本题,容易想到构建一个列表,列表中的每个元素表示s1s2的等价字符集合,这样我们只需要遍历baseStr中的每个字符,在列表中寻找每个字符对应的字典序最小的等价字符进行替换就可以得到最终的结果。

那么如何构建列表呢?首先考虑遍历一次s1s2,记录每次遍历中的等价字符到一个集合中,在下次遍历时如果字符已经出现过,就添加到已有的集合中,否则就新建一个集合。这么做有一个问题,就是新建集合中的字符在后续的遍历过程中有可能变成已有集合中字符的等价字符,所以我们需要对第一次遍历得到的集合列表进行合并操作,确保集合列表中的每个集合之间不存在等价字符。基于通过合并操作之后得到的集合列表,我们就可以计算获取最终的结果。

复杂度

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n ) O(n) O(n)

Code

class Solution:
    def smallestEquivalentString(self, s1: str, s2: str, baseStr: str) -> str:
        answer = ""
        str_list = []
        for i in range(len(s1)):
            if len(str_list) == 0:
                str_list.append({s1[i], s2[i]})
            else:
                is_added = False
                for sl in str_list:
                    if s1[i] in sl:
                        sl.add(s2[i])
                        is_added = True
                        break
                    if s2[i] in sl:
                        sl.add(s1[i])
                        is_added = True
                        break
                if not is_added:
                    str_list.append({s1[i], s2[i]})
        
        merge_list = [{0}]
        for i in range(1, len(str_list)):
            is_added = False
            for ml in merge_list:
                for j in ml:
                    if str_list[j] & str_list[i]:
                        ml.add(i)
                        is_added = True
                        break
                if is_added:
                    break
            if not is_added:
                merge_list.append({i})

        merge_str_list = []
        for ml in merge_list:
            merged_set = set()
            for i in ml:
                merged_set |= str_list[i]
            merge_str_list.append(merged_set)

        for c in baseStr:
            is_find = False
            for sl in merge_str_list:
                if c in sl:
                    answer += min(sl)
                    is_find = True
                    break
            if not is_find:
                answer += c
                
        return answer

你可能感兴趣的:(力扣(LeetCode),python,算法,力扣)