ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

动态归划之判断子系列

2021-12-30 02:05:22  阅读:103  来源: 互联网

标签:系列 归划 s1 t1 序列 range 字符串 动态 dp


# -*- encoding : utf-8 -*-
# @Author : 日落了
# @ Motto : 天不生python,IT 万古如长夜
# @project_name : DUOyi
# @Time : 2021/12/28
# @description : 判断子序列
'''
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

进阶:

如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?


'''


def isSubsequence1(s: str, t: str):
s1 = 0
t1 = 0
len1 = len(s)
len2 = len(t)

while s1 < len1 and t1 < len2:
if s[s1] == t[t1]:
s1 += 1
t1 += 1
else:
t1 += 1
if s1 == len1:
return True
else:
return False


'''

思路:

状态:dp[i][j]为s的从头开始到i的子字符串是否为t从头开始到j的子字符串的子序列

状态转移公式:

当char[i]==char[j]时,则字符i一定是j的子序列,如果0~i-1子字符串是0~j-1子字符串的子序列,则dp[i][j]=true,所以dp[i][j] = dp[i-1][j-1];
当char[i]!=char[i]时,即判断当前0~i子字符串是否是0~j-1的子字符串的子序列,即dp[i][j] = dp[i][j - 1]。如ab,eabc,虽然s的最后一个字符和t中最后一个字符不相等,但是因为ab是eab的子序列,
所以ab也是eabc的子序列
初始化:空字符串一定是t的子字符串的子序列,所以dp[0][j]=true

结果:返回dp[sLen][tLen]

'''



def isSubsequence(word1: str, word2: str):
m = len(word1)
n = len(word2)
dp = [[False for col in range(n + 1)] for row in range(m + 1)]
for j in range(n + 1):
dp[0][j] = True
for i in range(m):
for j in range(n):
# 相等的话 继续找下一位,i, j
if word1[i-1] == word2[j-1]:
dp[i][j] = dp[i - 1][j - 1]
else:
dp[i][j] = dp[i][j - 1]

if __name__ == '__main__':
print(isSubsequence1("aaaaaaaaaa",
"bbaaaa"))

标签:系列,归划,s1,t1,序列,range,字符串,动态,dp
来源: https://www.cnblogs.com/icxk/p/15747295.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有