題目本質:經過將字符串A的字母之間的連續交換位置,達到 兩個字符串之間徹底相同的狀況
解析:經過將不相等處的字母,發現以後找到想等的,而後進行位置替換。如此反覆。
問題在於慢,慢在於只要不相等,就會遍歷字符串以後全部的字符,大量重複的無心義的計算比較,因此將遍歷過的計算過的存在於memo字符串中間。
錯誤:沒有找到效率低的問題所在,在於比較過的無心義的比較。緩存
沒有發現字符串的遍歷,一種向前,一種向後。 對付效率低,一種有效的方式就是緩存,將比較過的先儲存起來
應用:緩存意識,發現大量比較,可能有重複,儲存。函數
遞歸函數,利用返回結果的話,返回結果是遞歸到最後,結束遍歷之後,獲得的結果纔有效。
import sys class Solution: def kSimilarity(self, A, B): memo=dict() self.ans=sys.maxsize def helper(a,b): if len(a)!=len(b): return 0 elif a==b: return 0 elif (a,b) in memo: print(a,b,memo[(a,b)]) return memo[(a,b)] elif a[-1]==b[-1]: self.ans=min(self.ans,helper(a[:-1],b[:-1])) else: for i in range(0,len(a)-1): # print(a,b) if a[i]==b[-1]: # print(a[:i],b[-1],a[i+1:]) a_new=a[:i]+a[-1]+a[i+1:-1] # print(a_new,b[:-1]) self.ans=min(self.ans,1+helper(a_new,b[:-1])) # self.ans=1+helper(a_new,b[:-1]) # break # print(self.ans) memo[(a,b)]=self.ans return self.ans self.ans=helper(A,B) return self.ans if __name__=='__main__': A = "aabc" B = "abca" A="abbcac" B="abcbca" A="abccaacceecdeea" B="bcaacceeccdeaae" A="fffeaacbdbdafcfbbafb" B="abcbdfafffefabdbbafc" # A="abfdfacbd b d a f cfbbafb" # B="abcbdfaff f e f a bdbbafc" # A="abccab" # B="abccab" st=Solution() # out=st.kSimilarity(A,B) out=st.kSimilarity(A,B) print(out)