思路:一开始按照naive的DP,开3维数组,复杂度O(NNK),TLE
# Complete the substringDiff function below.
def substringDiff(k, s1, s2):
n=len(s1)
dp=[[[0 for _ in range(k+1)] for _ in range(n)] for _ in range(n)]
ma=0
for j in range(n):
for l in range(0 if s1[0]==s2[j] else 1, k+1):
dp[0][j][l]=ma=1
for i in range(n):
for l in range(0 if s1[i]==s2[0] else 1, k+1):
dp[i][0][l]=ma=1
for i in range(1,n):
for j in range(1,n):
for l in range(k+1):
if s1[i]==s2[j]:
dp[i][j][l]=1+dp[i-1][j-1][l]
elif l>=1:
dp[i][j][l]=1+dp[i-1][j-1][l-1]
ma=max(ma,dp[i][j][-1])
return ma
print(substringDiff(2, 'tabriz', 'torino'))
print(substringDiff(0, 'abacba', 'abcaba'))
print(substringDiff(3, 'helloworld', 'yellomarin'))
可以用二分优化,cnt[i][j]表示以ij结尾的2个以0开始的substring对不上的总数(结尾对其)
然后二分结果即可,复杂度O(NNlogN),Python还是TLE
# Complete the substringDiff function below.
def helper(cnt,mid,k,n):
for i in range(mid,n+1):
for j in range(mid,n+1):
if cnt[i][j]-cnt[i-mid][j-mid]<=k: return True
return False
def substringDiff(k, s1, s2):
n=len(s1)
cnt=[[0 for _ in range(n+1)] for _ in range(n+1)]
for i in range(n):
for j in range(n):
cnt[i+1][j+1]=cnt[i][j] if s1[i]==s2[j] else cnt[i][j]+1
lo,hi=0,n
while lo<hi:
mid=(lo+hi+1)//2
if helper(cnt,mid,k,n): lo=mid
else: hi=mid-1
return lo
print(substringDiff(2, 'tabriz', 'torino'))
print(substringDiff(0, 'abacba', 'abcaba'))
print(substringDiff(3, 'helloworld', 'yellomarin'))
讨论区有O(NN)的解法
https://www.hackerrank.com/challenges/substring-diff/editorial
https://www.hackerrank.com/challenges/substring-diff/forum/comments/485856