此题一种直观的思想是O(mn)的算法,就是遍历S,对于S中的每个值,在T中进行查找,然后提前。通过看他人的答案,发现了O(m+n)的方法,该方法是首先统计T中每个单词出现的频率,然后遍历S,对于S中每个值,在结果中添加该值对应的频率的字符串,最后再把没有出现的值放在后面。mark一下:
O(MN):
class Solution:
def customSortString(self, S, T):
"""
:type S: str
:type T: str
:rtype: str
"""
index = 0
TT = list(T)
for i in range(len(S)):
val = S[i]
for j in range(len(TT)):
if val == TT[j]:
TT[j] = TT[index]
TT[index] = val
index += 1
return "".join(TT)
O(M+N):
from collections import Counter
class Solution:
def customSortString(self, S, T):
"""
:type S: str
:type T: str
:rtype: str
"""
s = set(S)
t = Counter(T)
ans = []
for c in S:
ans.append(c*t[c])
for c in t.keys():
if c not in s:
ans.append(c*t[c])
return "".join(ans)
hint:
其实我感觉O(M+N)的算法有待商榷,因为其中 not in 这种操作有可能就是通过for循环实现的?当然也有可能是hash。
在python当中字符串是常量,是不能直接对字符串进行修改的,所以操作字符串的时候一般需要字符串和list之间的转换。str转list,list(str), list转str,“”.join(ans)
Counter返回一个dict类型,其中键值为str中出现的字符,value为每个字符出现的次数