1055. 形成字符串的最短路径

博客内容讲述了在解决编程问题1055时遇到的思路和错误,以及如何使用双指针法来找到字符串子序列。作者通过分析错误,发现`index()`函数导致的问题,并引入`temp`变量来修正查找顺序,最终实现正确解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

代码:

class Solution:
    def shortestWay(self, source: str, target: str) -> int:
        #初始化的过程
        s = []
        t = []
        for i in range(0,len(source)):
            s.append(source[i])
        for i in range(0,len(target)):
            t.append(target[i])
        
        temp = -1
        flag = 0
        if t[0] not in s:
            return -1
        num = 1
        length = len(s)
        for i in range(1,len(t)):
            if t[i] not in s:
                return -1
            index = s.index(t[i-1])
            if index < temp:
                index = temp

            for j in range(index+1,length):
                if t[i] == s[j]:
                    temp = j
                    flag = 1
                    break;
            if flag == 0:
                temp = -1
                num += 1
            flag = 0
        return num

 下面写下我的思路:

采用的我觉得也是双指针的办法:

1、i指针指向target中的每一个字符,依次遍历

2、每遍历一个元素,我要找到当前元素的上一个元素在source中的位置(所以i是从1开始的)            index;我们从source[index+1]的位置开始遍历,看能不能找到当前遍历的元素,如果能找找            到,那么当前元素+前一个元素肯定是目标子序列;如果找不到,那么当前元素在source中的          位置就在它前一个元素之前,这样就不是子序列了,我们就要给Num加1,代表产生了一个新        的子序列

3、当然每次最先判断的还是,当前元素在不在source中,不在的话直接返回-1

4、目前为止,思路都比较直观,但是提交的时候提示这个用例没过

     source = 'aaa'

    target = 'aaaaaaa'

    希望输出的值是3,但是运行自己的程序,结果是1

    我发现,用index()这个函数,每次得到的都是第一个元素的值,比如a 每次index 都是0,这样        肯定是有问题的

    为了解决这个问题,我引入了temp变量;每次在source找到相同元素的时候,我会把当前j   (source[j])的值 赋给temp,那么下一次找的元素,肯定要在temp之后;(怎么说,意思就是,如      果我当前一直在查找子序列,那么我们只能一直往后查,不能跑到前面去)

   当我们找不到的时候,在给Num++的时候,记得把temp置为-1,代表开始新的一次查找

其实感觉挺乱的,我自己写的时候感觉都说不清楚..........

看了一个写的很不错的题解,自己模仿写了下,思路都写在注释上了,其实很简单...

class Solution:
    def shortestWay(self, source: str, target: str) -> int:
        i = 0
        num = 0
        while i < len(target):   #什么时候结束循环?target遍历完的时候
            j = 0  #j用来遍历source
            temp = i
            while (i < len(target)) and (j<len(source)):
                #什么时候 i - target往后移?在source中找到与自己相同值得时候
                if source[j] == target[i]:
                    i += 1
                #否则j一直后移寻找
                j += 1 

            #什么时候代表没找到,j从0开始遍历了一遍,i始终没有移动的时候
            if i == temp:
                return -1
            
            num += 1  #什么时候num会+1?遍历完一遍source的时候
        return num 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值