leetcode-854-K-Similar Strings

題目本質:經過將字符串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)
相關文章
相關標籤/搜索