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)
    原文作者:龙仔
    原文地址: https://segmentfault.com/a/1190000016249296
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞