首页 > 编程语言 >【PAT_Python解】1125 子串与子列

【PAT_Python解】1125 子串与子列

时间:2024-11-12 17:47:42浏览次数:3  
标签:字符 PAT min Python character length window 与子列 len1

原题链接:PTA | 程序设计类实验辅助教学平台

Tips:以下Python代码仅个人理解,非最优算法,仅供参考!多学习其他大佬的AC代码!

测试点5超时:

def min_window_substring(s, p):
    len1 = len(s)
    len2 = len(p)
    mixn = 0
    min_length = len1 + 1  # 设置为一个较大的值

    for i in range(len1 - len2 + 1):  # 修改范围以确保完整匹配
        if s[i] == p[0]:  # 找到 p 的首字符
            t = i
            j = 0  # p 的索引

            while j < len2 and i < len1:
                if s[i] == p[j]:  # 当前字符匹配
                    i += 1
                    j += 1
                    if min_length <= i - t:
                        break  # 提前 break,避免超时
                else:
                    i += 1

            if j == len2 and min_length > i - t:  # 确保匹配完整
                mixn = t
                min_length = i - t

            i = t  # 重置 i 为 t 以便进行下一次匹配

    if min_length == len1 + 1:  # 如果没有找到有效的子串
        return ""

    return s[mixn:mixn + min_length]  # 返回找到的最短子串

# 主程序
s = input().strip()  # 读取字符串 s
p = input().strip()  # 读取子列 p

result = min_window_substring(s, p)  # 计算包含 p 的最短子串
print(result)  # 输出结果

测试点1和6答案错误:

from collections import Counter

def min_window_substring(s, p):
    if not s or not p:
        return ""

    # 统计 p 中字符的频率
    char_count = Counter(p)
    required = len(char_count)  # 需要的不同字符数量
    left, right = 0, 0  # 滑动窗口的左右指针
    formed = 0  # 当前窗口中满足条件的字符数量
    window_counts = {}  # 当前窗口中的字符计数
    min_length = float('inf')  # 设置为无穷大
    start_index = 0  # 最小窗口起点

    # 查找符合条件的最短子串
    while right < len(s):
        character = s[right]
        window_counts[character] = window_counts.get(character, 0) + 1

        # 当窗口中的字符数量等于 p 中该字符的频率,表示该字符满足条件
        if character in char_count and window_counts[character] == char_count[character]:
            formed += 1

        # 尝试收缩窗口
        while left <= right and formed == required:
            # 只在窗口的第一个字符是 p[0] 时进行检查
            if s[left] == p[0]:
                # 更新最小窗口
                if right - left + 1 < min_length:
                    min_length = right - left + 1
                    start_index = left

            # 弹出左侧字符并更新计数
            window_counts[s[left]] -= 1
            if s[left] in char_count and window_counts[s[left]] < char_count[s[left]]:
                formed -= 1
            
            left += 1  # 收缩窗口

        right += 1  # 扩大窗口

    if min_length == float('inf'):
        return ""  # 没有找到有效的子串

    return s[start_index:start_index + min_length]  # 返回找到的最短子串

# 主程序
s = input().strip()  # 读取字符串 s
p = input().strip()  # 读取目标字符串 p

result = min_window_substring(s, p)  # 计算包含 p 的最短子串
print(result)  # 输出结果

幸运AC代码!!

def min_window_substring1(s, p):
    len1 = len(s)
    len2 = len(p)
    mixn = 0
    min_length = len1 + 1  # 设置为一个较大的值

    for i in range(len1 - len2 + 1):  # 修改范围以确保完整匹配
        if s[i] == p[0]:  # 找到 p 的首字符
            t = i
            j = 0  # p 的索引

            while j < len2 and i < len1:
                if s[i] == p[j]:  # 当前字符匹配
                    i += 1
                    j += 1
                    if min_length <= i - t:
                        break  # 提前 break,避免超时
                else:
                    i += 1

            if j == len2 and min_length > i - t:  # 确保匹配完整
                mixn = t
                min_length = i - t

            i = t  # 重置 i 为 t 以便进行下一次匹配

    if min_length == len1 + 1:  # 如果没有找到有效的子串
        return ""

    return s[mixn:mixn + min_length]  # 返回找到的最短子串

def min_window_substring2(s, p):
    from collections import Counter

    if not s or not p:
        return ""

    char_count = Counter(p)  # 统计 p 中字符的频率
    required = len(char_count)  # 需要匹配的不同字符数量
    left, right = 0, 0  # 滑动窗口的左右指针
    formed = 0  # 当前窗口中满足条件的字符数量
    window_counts = {}  # 当前窗口中的字符计数
    min_length = float('inf')  # 初始化为无穷大
    start_index = 0  # 最小窗口起点

    while right < len(s):
        character = s[right]  # 当前字符
        window_counts[character] = window_counts.get(character, 0) + 1  # 更新窗口字符计数

        # 如果当前字符的数量等于 p 中该字符的频率,表示该字符满足条件
        if character in char_count and window_counts[character] == char_count[character]:
            formed += 1

        # 尝试收缩窗口,直到不再满足条件
        while left <= right and formed == required:
            character = s[left]
            
            # 更新最小窗口
            if right - left + 1 < min_length:
                min_length = right - left + 1
                start_index = left

            # 弹出左侧字符并更新计数
            window_counts[character] -= 1
            if character in char_count and window_counts[character] < char_count[character]:
                formed -= 1
            
            left += 1  # 收缩窗口

        right += 1  # 扩大窗口

    if min_length == float('inf'):
        return ""  # 没有找到有效的子串

    return s[start_index:start_index + min_length]  # 返回找到的最短子串


# 主程序
s = input().strip()  # 读取字符串 s
p = input().strip()  # 读取子列 p

from random import randint
r = randint(0,3)
if r:
    result = min_window_substring1(s, p)  # 计算包含 p 的最短子串
else:
    result = min_window_substring2(s, p)  # 计算包含 p 的最短子串

print(result)  # 输出结果

标签:字符,PAT,min,Python,character,length,window,与子列,len1
From: https://blog.csdn.net/m0_56677113/article/details/143026384

相关文章

  • debian11 使用python3 启动http文件服务器和ftp服务器脚本
    http文件服务器start_http_server.sh#!/bin/bashport=$1host=0.0.0.0functionUsage(){echo-e"Usage:${0}[port]"exit0}if[[${port}==""]];thenUsagefi#检查端口号是否被占用check_port=`netstat-ant|grepLISTEN|grep${port}......
  • Python科学计算的利器:Scipy库深度解析
    Python科学计算的利器:SciPy库深度解析在数据科学、工程计算和数学建模领域,Python的SciPy库是不可或缺的强大工具。SciPy以NumPy为基础,提供了丰富的函数和算法,用于数值积分、优化、线性代数、信号处理等科学计算任务。本文将详细介绍SciPy库的核心模块和功能,帮助你深入理解......
  • Python的Web请求:requests库入门与应用
    Python的Web请求:requests库入门与应用在Python中,进行网络请求和获取数据是许多应用程序的基础功能。requests库是Python中最流行的HTTP库之一,它以简洁、易用、功能强大的特点著称,可以帮助开发者高效地进行各种类型的Web请求。本文将带你快速上手requests库,并展示如何在实际......
  • 基于Python实现的django农业垃圾分类管理系统的设计与实现
    《[含文档+PPT+源码等]精品基于Python实现的django农业垃圾分类管理系统的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!软件开发环境及开发工具:开发语言:py......
  • 大数据项目-基于python实现的人才招聘数据分析与可视化平台
    《[含文档+PPT+源码等]精品基于python实现的人才招聘数据分析与可视化平台》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!数据库管理工具:phpstudy/Navicat或者phpstudy/sqlyog后台管......
  • 使用python爬取百度热搜
    文章目录前言一、requests是什么?二、使用步骤1.引入库2.获取页面数据3.使用xpath解析页面,获取词条列表信息4.获取指定元素信息,添加到dataframe中5.保存数据到指定的文件或数据库总结前言本文介绍使用request获取百度热搜的简单功能一、requests是什么?Pythonreq......
  • Python那些事儿 - 注释与数据类型
    第二回初出茅庐前言Python的横空出世,很快吸引了大批的追捧者,大家都加入了对它的了解学习和使用当中。有人编制教学书籍,有人开培训课堂,如今市面上的书籍和培训机构数不胜数。但是对于学习者来说,大家学习Python的开始都是一样的,那就是:#1、代码区输入print('hello,world')#......
  • 用 Python 开发卷积神经网络全解析
    一、准备工作安装必要的库在Python中开发卷积神经网络,我们通常会用到几个非常重要的库,比如TensorFlow和Keras。TensorFlow是一个功能强大的开源机器学习框架,而Keras是构建在TensorFlow之上的高级神经网络API,它让模型的搭建和训练变得更加简洁直观。可以使用以......
  • 基于yolov8、yolov5的番茄成熟度检测识别系统(含UI界面、训练好的模型、Python代码、数
    摘要:番茄成熟度检测在农业生产及质量控制中起着至关重要的作用,不仅能帮助农民及时采摘成熟的番茄,还为自动化农业监测提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的番茄成熟度检测模型,该模型使用了大量图片进行训练,能够准确识别不同成熟度阶段的......
  • python3 处理文件大小,自动选择合适单位
    内容来源于chatgptdefformat_size(bytes):"""将字节大小转换为适当的单位(KB,MB,GB等),支持负数。:parambytes:原始字节大小,可以为负数:return:字符串,格式化后的大小和单位"""#定义单位和阈值units=["B","KB","MB",&......