给你两个字符串 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



LeeCode 2186.使两字符串互为字母异位词的最少步骤数插图

时间复杂度高了,想办法降低一下时间复杂度

因为全是小写字母,直接统计个数

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)

        
LeeCode 2186.使两字符串互为字母异位词的最少步骤数插图1

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

作者 admin

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注