📌  相关文章
📜  可以从第一个字符串的字符形成第二个字符串的次数(1)

📅  最后修改于: 2023-12-03 14:50:37.606000             🧑  作者: Mango

可以从第一个字符串的字符形成第二个字符串的次数

有两个字符串s1和s2,现在你需要判断字符串s2是否可以通过s1中的字符重新排列组合形成。

例如:

输入:s1 = "abc",s2 = "cba" 输出:True 解释:s2可以通过s1中的字符重新排列组合形成。

输入:s1 = "abcd",s2 = "cbad" 输出:False 解释:因为字符d在s1中只出现了一次,因此无法通过字符重新排列组合成s2。

为了解决这个问题,我们需要统计s1中每个字符出现的次数,并且遍历s2中的每个字符,在s1中减去对应字符的出现次数。

如果遍历完成后,s1中每个字符的出现次数都是0,说明s2可以通过s1中的字符重新排列组合形成。否则,说明不行。

下面是Python代码示例:

def can_construct(s1: str, s2: str) -> bool:
    # 用一个字典存储s1中每个字符出现的次数
    s1_dict = {}
    for ch in s1:
        if ch in s1_dict:
            s1_dict[ch] += 1
        else:
            s1_dict[ch] = 1

    # 遍历s2中的每个字符,减去s1_dict中对应字符的出现次数
    for ch in s2:
        if ch in s1_dict:
            s1_dict[ch] -= 1
            if s1_dict[ch] < 0:
                # s1中对应字符出现的次数不够,无法重新排列组合成s2
                return False
        else:
            # s1中没有对应的字符,无法重新排列组合成s2
            return False

    # 判断s1中每个字符的出现次数是否都是0
    for key in s1_dict:
        if s1_dict[key] != 0:
            # s2中的字符在s1中出现的次数不够,无法重新排列组合成s2
            return False

    # s2可以通过s1中的字符重新排列组合成
    return True

这个算法的时间复杂度为O(n),其中n为s2的长度。因为我们需要遍历s2中的每个字符一次,并在s1_dict中查找对应字符的出现次数。空间复杂度为O(k),其中k为s1中不同字符的个数,因为s1_dict最多需要存储k个字符的出现次数。