题目描述:
给你两个字符串 s
和 t
,每个字符串中的字符都不重复,且 t
是 s
的一个排列。
排列差 定义为 s
和 t
中每个字符在两个字符串中位置的绝对差值之和。
返回 s
和 t
之间的 排列差
输入输出示例:
思路一:暴力解法,直接遍历s和t两个字符串,找到相同的字符的时候我们进行对下标取差的绝对值,但是这个方法时间复杂度为O(n^2),且因为输入的最多长度为26,所以不会报超时。我们可以再进行优化。
class Solution:
def findPermutationDifference(self, s: str, t: str) -> int:
ans = 0
n,m = len(s),len(t)
for i in range(n):
for j in range(m):
if s[i] == t[j] :
ans += abs(i-j)
return ans
优化后的思路二:我们使用两个字典将s和t中每个字符对应的下标存储起来,然后遍历s或者是t字符串,将当前字符在两个字典中对应的值进行取差的绝对值。这样我们就相对于暴力解法优化了很多,但本身因为输入实例不多,所以时间上二者不会差很大。
class Solution:
def findPermutationDifference(self, s: str, t: str) -> int:
ans = 0
dict1 = {}
dict2 = {}
for i in range(len(s)):
#用dict1记录s中各字符的下标,dict2记录t的
dict1[s[i]] = i
dict2[t[i]] = i
for char_s in s:
#同一个字符的下标相减
ans += abs(dict1[char_s] - dict2[char_s])
return ans
我们对思路二进行再优化,这次使用一个字典dict1用来存储s中字符以及对应的下标,然后我们遍历t字符串,将t中当前字符的下标与dict1中该字符对应的值作差的绝对值。
class Solution:
def findPermutationDifference(self, s: str, t: str) -> int:
ans = 0
dict1 = {}
#将s下标与字符存到字典
for index,char_s in enumerate(s):
dict1[char_s] = index
for index,char_t in enumerate(t):
#找t当前字符的下标差
ans += abs(dict1[char_t] - index)
return ans