题目:
代码:
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