leetcode_1202. 交换字符串中的元素

举报
悲恋花丶无心之人 发表于 2021/02/03 00:36:35 2021/02/03
【摘要】 目录 一、题目内容 二、解题思路 三、代码 一、题目内容 给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。 你可以 任意多次交换 在 pairs 中任意一对索引处的字符。 返回...

目录

一、题目内容

二、解题思路

三、代码


一、题目内容

给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。

你可以 任意多次交换 在 pairs 中任意一对索引处的字符。

返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。

示例 1:

输入:s = "dcab", pairs = [[0,3],[1,2]]
输出:"bacd"
解释: 
交换 s[0] 和 s[3], s = "bcad"
交换 s[1] 和 s[2], s = "bacd"

示例 2:

输入:s = "dcab", pairs = [[0,3],[1,2],[0,2]]
输出:"abcd"
解释:
交换 s[0] 和 s[3], s = "bcad"
交换 s[0] 和 s[2], s = "acbd"
交换 s[1] 和 s[2], s = "abcd"

示例 3:

输入:s = "cba", pairs = [[0,1],[1,2]]
输出:"abc"
解释:
交换 s[0] 和 s[1], s = "bca"
交换 s[1] 和 s[2], s = "bac"
交换 s[0] 和 s[1], s = "abc"

提示:

1 <= s.length <= 10^5
0 <= pairs.length <= 10^5
0 <= pairs[i][0], pairs[i][1] < s.length
s 中只含有小写英文字母

二、解题思路

并查集,需要找到每个区间的最小索引和最大,可能出现多个区间起点为键值的列表,列表里是那些之后的可以连通节点;

对每个区间列表对应的字符进行排序,然后放在对应索引的位置中,即是按字典序最小的字符串。

三、代码


  
  1. from collections import defaultdict
  2. class Solution:
  3. def smallestStringWithSwaps(self, s: str, pairs: list) -> str:
  4. if len(pairs) == 0:
  5. return s
  6. p = [-1 for _ in range(len(s))]
  7. def find(x):
  8. if p[x] < 0:
  9. return x
  10. return find(p[x])
  11. def merge(x1, x2):
  12. if x1 == x2:
  13. return
  14. if x1 < x2:
  15. p[x2] = x1
  16. else:
  17. p[x1] = x2
  18. for pair in pairs:
  19. x1 = find(pair[0])
  20. x2 = find(pair[1])
  21. merge(x1, x2)
  22. x_dict = defaultdict(list)
  23. for i in range(len(s)):
  24. x = find(i)
  25. x_dict[x].append(i)
  26. res = ['' for _ in range(len(s))]
  27. for k, list_v in x_dict.items():
  28. s_in_list_v = [s[i] for i in list_v]
  29. s_in_list_v.sort()
  30. for i in range(len(list_v)):
  31. res[list_v[i]] = s_in_list_v[i]
  32. return ''.join(res)
  33. if __name__ == '__main__':
  34. s = "dcab"
  35. pairs = [[0,3],[1,2]]
  36. ss = Solution()
  37. ans = ss.smallestStringWithSwaps(s, pairs)
  38. print(ans)

文章来源: nickhuang1996.blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。

原文链接:nickhuang1996.blog.csdn.net/article/details/112472068

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。