力扣刷题记录——392. 判断子序列、401. 二进制手表、409.最长回文串

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《392. 判断子序列、401. 二进制手表、409.最长回文串》。

392. 判断子序列

题目描述

给定字符串 st ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace" "abcde" 的一个子序列,而"aec" 不是)。
示例 1:
输入:s = "abc", t = "ahbgdc" 输出:true
示例 2:
输入:s = "axc", t = "ahbgdc" 输出:false

解题思路

定义两个指针,分别去指向s和t,当两个指针所指内容相等时,两个指针分别加一,如果不相等,t指针加一,退出循环的条件就是某一个指针达到了对应字符串的长度。最后判断s指针是不是达到了s的长度即可解决问题。击败率还是蛮高的,挺满意的。

解题代码

def isSubsequence(s: str, t: str):
    # s = "abc", t = "ahbgdc"
    # 定义两个指针去指向s和t
    s_p = 0
    t_p = 0
    while s_p < len(s) and t_p < len(t):
        if s[s_p] == t[t_p]:
            s_p += 1
            t_p += 1
        else:
            t_p += 1
    if s_p == len(s):
        return True
    else:
        return False
力扣刷题记录——392. 判断子序列、401. 二进制手表、409.最长回文串_第1张图片

401. 二进制手表

题目描述

二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。
例如,下面的二进制手表读取 "3:25" 。
力扣刷题记录——392. 判断子序列、401. 二进制手表、409.最长回文串_第2张图片
(图源: WikiMedia - Binary clock samui moon.jpg ,许可协议: Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。
小时不会以零开头:
例如,"01:00" 是无效的时间,正确的写法应该是 "1:00" 。
分钟必须由两位数组成,可能会以零开头:
例如,"10:2" 是无效的时间,正确的写法应该是 "10:02" 。

示例 1:
输入:turnedOn = 1输出:["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]
示例 2:
输入:turnedOn = 9输出:[]

解题思路

拿到这个题目的时候还是没有什么思路,想的还是暴力枚举法,虽然我知道时间复杂度肯定很高,不管了,能抓住老鼠的都是好猫。思路就是for循环去枚举,小时列表中一次选出i个,分钟列表中选出turnedOn-i,用到了itertools这个内置库,可以在指定的列表中选择指定的个数。之后就是求和判断符不符合规则,符合规则的转化格式存到列表中,最终返回这个最终列表。

解题代码

import itertools
class Solution:
    def readBinaryWatch(self, turnedOn: int) -> List[str]:
        # turnedOn = 5
        hour_list = [8,4,2,1]
        min_list = [32,16,8,4,2,1]
        target_list = []
        for i in range(turnedOn+1):
            # 在hour_list 里面选i个,在min_List选turnedOn-i个,之后求和判断,看有没有超出限制,没有的话添加到目标列表中,最后返回这个目标列表
            on_list = list(itertools.permutations(hour_list, i))
            down_list = list(itertools.permutations(min_list,turnedOn-i))
            for m in on_list:
                for n in down_list:
                    if sum(m) <=11 and sum(n) <=59:
                        if len(str(sum(n)))==1:
                            target_str = "{0}:0{1}".format(sum(m),sum(n))
                        else:
                            target_str = "{0}:{1}".format(sum(m), sum(n))
                        target_list.append(target_str)
        target_list = list(set(target_list))
        return target_list
力扣刷题记录——392. 判断子序列、401. 二进制手表、409.最长回文串_第3张图片

409.最长回文串

题目描述

给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串
在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。

示例 1:
输入:s = "abccccdd" 输出:7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
示例 2:
输入:s = "a" 输入:1
示例 3:
输入:s = "aaaaaccc" 输入:7

解题思路

这一题思路还是比较清晰的,还是用set把列表中的每一个元素提取出来,如果只有一个元素的话,那么直接返回字符串的长度就可以了。之后设置一个开关target,判断列表中是否有出现次数对2取模还余1的,如果有的话,target就要变成1。我们之后对单独对target进行一次判断,如果target发生变化,说明回文串中间还能再加一个数,所以最终结果+1。中间用一个for循环去数每一个元素出现的次数,我们只记录大于等于2的,并且只取2的整数倍。用一个count去记录,最终返回count的值。

解题代码

def longestPalindrome(s: str):
    s_list = [i for i in s]
    s__set_list = list(set(s))
    count = 0
    target = 0
    if len(s__set_list)==1:
        return len(s)
    for i in s__set_list:
        if s_list.count(i)%2 == 1:
            target = 1
        if s_list.count(i) >= 2:
            count += (s_list.count(i)//2)*2

    if target == 1:
        return count+1
    else:
        return count
力扣刷题记录——392. 判断子序列、401. 二进制手表、409.最长回文串_第4张图片

你可能感兴趣的:(蓝桥杯刷题,数据结构,算法,力扣,蓝桥杯,刷题)