公共子串+变长窗口+动态规划 | HJ75 公共子串计算

# 最优解1(某字符为首的子串不再为公共子串时,首字符调换到下一个)
while True:
    try:
        a = input().upper()
        b = input().upper()
        n = 0
        for i in range(len(a)):
            if a[i-n:i+1] in b:  # 窗口尾端扩张1格,若也满足子串,子串长度n值加1,下一次窗口首端位置不变
                n += 1
        print(n)
    except:
        break

# 最优解2:动态规划
def solution(s1, s2):
    mxlen = 0
    dp = [[0 for i in range(len(s2)+1)] for j in range(len(s1)+1)]    # 动态规划数组
    for i in range(len(s1)):
        for j in range(len(s2)): 
            if s1[i] == s2[j]:
                dp[i+1][j+1] = dp[i][j] + 1
                if dp[i+1][j+1] > mxlen:
                    mxlen = dp[i+1][j+1]
    return mxlen
 
while True:
    try:
        s1 = input()
        s2 = input()
        print(solution(s1,s2))
    except:
        break;


# 我的代码
try:
    s1 = input()
    s2 = input()
    ls, ss = (s1,s2) if len(s1)>len(s2) else (s2,s1)
    subs = {}
    max_sub = 0
    p1=p2=0
    for p1 in range(len(ss)):
        for p2 in range(p1+1, len(ss)+1):
            if ss[p1:p2] not in subs:
                subs[ss[p1:p2]] = len(ss[p1:p2])
                max_sub = max(max_sub, len(ss[p1:p2]))
    max_com_sub = 0
    for sub in subs:
        if sub in ls:
            max_com_sub = max(max_com_sub, subs[sub])
            if max_com_sub == max_sub:
                break
    print(max_com_sub)

except Exception as e:
    print(e.with_traceback)

华为笔试刷题 文章被收录于专栏

高质量题: 1~40:HJ16,HJ22,HJ24,HJ26,HJ27,HJ28,HJ35,HJ37,HJ39; 40~80:HJ41,HJ42,HJ43,HJ44,HJ48,HJ50,HJ52,HJ53,HJ57,HJ61,HJ63,HJ64,HJ70,HJ71,HJ74,HJ77; 80~108:HJ82,HJ85,HJ88,HJ89,HJ93,HJ95,HJ98,HJ103,HJ107

全部评论

相关推荐

10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务