leetcode-854-K-Similar Strings

代码搬运工
• 阅读 2898
题目本质:通过将字符串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)
点赞
收藏
评论区
推荐文章
半臻 半臻
3年前
Python基础11——正则表达式
19正则表达式19.1正则基础正则表达式:字符串处理工具应用场景1.html查询2.验证字符串是否符合规则re模块match方法python通过正则表达式对字符串进行匹配importre使用match方法进行匹配操作re.match()从字符串的开始位置进行匹配,匹配成功,返回match对象。匹配失败,返回Noneresre
似梦清欢 似梦清欢
2年前
排序算法(冒泡、快速、插入)
稳定性:排序前后相等的元素位置是否会被交换。冒泡排序strcpy只能拷贝字符串,整型或浮点型数组需要用memcpy。memcpy称为内存拷贝接口,可以将某一段连续的内存放入另一段连续的内存中。在使用随机数的代码中使用固定的数组有利于调试。:::tipmem
Easter79 Easter79
3年前
str的用法
  字符串的索引切片以及常用的操作方法都是形成新的字符串,和原字符串没有关系 切片和索引\按照索引取值按照切片取值,顾头不顾尾,切片加步长 只要倒叙取值就要加上反向步长capitalize() 首字母大写\center() 将字符串居中可以添加填充物\swapcase() 大小写反转
Stella981 Stella981
3年前
C++中stoi函数
作用:  将n进制的字符串转化为十进制头文件:include<string用法:1stoi(字符串,起始位置,n进制),将n进制的字符串转化为十进制23示例:4stoi(str,0,2);//将字符串str从0位置开始到末尾的2
Stella981 Stella981
3年前
Python 字符串常用方法 string
字符串操作  描述string.capitalize()将字符串的第一个字母大写string.count()    获得字符串中某个字符串的数目string.find()获得字符串中某一子字符串的起始位置,无则返回1string.isalnum()检测字符串是仅包含09AZazstring.isalpha()
Stella981 Stella981
3年前
CoreGraphics 之CGAffineTransform仿射变换(3)
 CoreGraphics的仿射变换可以用于平移、旋转、缩放变换路径或者图形上下文。  (1)平移变换将路径或图形上下文中的形状的当前位置平移到另一个相对位置。举例来说,如果你在(10,20)的位置处画一个点,对它应用(30,40)的平移变换,然后绘制它,这个点将被绘制在(40,60)的位置处。为了创建一个平移变换,使用CGAffineTra
Wesley13 Wesley13
3年前
MySQL常用函数
字符串函数concat(a,b,c,...)连接为一个字符串insert(str,x,y,instr)将字符串str从第x位置开始,y个字符长的子串替换为字符串instrLower(str)所有字符变为小写upper(str)所有字符变为大写
Wesley13 Wesley13
3年前
125. 验证回文串
\TOC\题目给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例1:输入:"Aman,aplan,acanal:Panama"输出:true示例2:输入:"raceacar"输出
Stella981 Stella981
3年前
Python运算符 Python从入门到放弃
\和   赋值,判断是否相等。  If(c1)写成if(c1)会直接报错,Python中if条件中不允许赋值。(C语言中允许)号数字之间是计算和,字符串之间是拼接的意思如果非要在原始字符串结尾输入反斜杠,可以如何灵活处理?
Stella981 Stella981
3年前
CodeForces985F:Isomorphic Strings (字符串&hash)
题意:取出字符串Str里的两个串S,T,问对应位置的的字符在否有一一映射关系。hash:对于每个字符s‘a’‘z’,我们任意找一个i,满足Sis,(代码里用lower\_bound在区间找到最小的位置i)其对应的字符为Tit。然后我们判断这段区间里s的hash值是否等于t的hash值。不难证明26个字母都满足时对应hash相同时,才有
Stella981 Stella981
3年前
Leetcode 424.替换后的最长重复字符
替换后的最长重复字符给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 _k_次。在执行上述操作后,找到包含重复字母的最长子串的长度。注意:字符串长度和_k_不会超过 104。示例1:输入:s"ABAB",k2输
代码搬运工
代码搬运工
Lv1
醉后莫思家,借取师师宿。
文章
4
粉丝
0
获赞
0