📅  最后修改于: 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个字符的出现次数。