给你两个字符串 s 和 t 。在一步操作中,你可以给 s 或者 t 追加 任一字符 。
返回使 s 和 t 互为 字母异位词 所需的最少步骤数。
字母异位词 指字母相同但是顺序不同(或者相同)的字符串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-number-of-steps-to-make-two-strings-anagram-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:找两个字符串不相同的地方互相补充
python3实现
class Solution:
def minSteps(self, s: str, t: str) -> int:
# 找出不同点,双方都补充
p_s_start = 0
p_t_start = 0
s_list = list(s)
t_list = list(t)
while p_s_start <= len(s_list) - 1:
# print("此时比较的元素是:", s_list[p_s_start], "vs", t_list[p_t_start])
if s_list[p_s_start] == t_list[p_t_start]:
s_list[p_s_start] = (s_list[p_s_start], "Locked")
t_list[p_t_start] = (t_list[p_t_start], "Locked")
p_s_start += 1
p_t_start = 0
else:
if p_t_start == len(t_list) - 1:
p_s_start += 1
p_t_start = 0
else:
p_t_start += 1
# print("s_list:", s_list)
# print("t_list:", t_list)
# 将s_list中所有没加锁的,放到t_list中去
# 将t_list中所有没加索的,放到s_list中去。
# 但是,这道题目求的是个数,直接统计返回输出就结束了
count_s_list = 0
for i in s_list:
if type(i) == type("str"):
count_s_list += 1
count_t_list = 0
for j in t_list:
if type(j) == type("str"):
count_t_list += 1
# print(count_s_list + count_t_list)
return count_s_list + count_t_list

时间复杂度高了,想办法降低一下时间复杂度
因为全是小写字母,直接统计个数
class Solution:
def minSteps(self, s: str, t: str) -> int:
# 因为都是小写字母,直接统计然后补充就行了
# 去重,得到键
s_set = set(s)
t_set = set(t)
s_dic = {}
t_dic = {}
# 生成字典
for element in s_set:
# 统计,得到值
s_dic[element] = s.count(element)
for element in t_set:
t_dic[element] = t.count(element)
# 就算最差的时间复杂度出现了,也不会跑出26个字母
need_append_nums = []
for element in s_dic:
if element in t_dic:
if s_dic[element] - t_dic[element] > 0:
need_append_nums.append(s_dic[element] - t_dic[element])
if s_dic[element] - t_dic[element] < 0:
need_append_nums.append(t_dic[element] - s_dic[element])
else:
need_append_nums.append(s_dic[element])
for element in t_dic:
if element not in s_dic:
need_append_nums.append(t_dic[element])
# print("need_append_nums:", sum(need_append_nums))
return sum(need_append_nums)

有史以来第一次击败百分百,纪念一下~