【算法】算法题-20231111

一、409. 最长回文串

简单

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

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

示例 2:
输入:s = “a”
输出:1

示例 3:
输入:s = “aaaaaccc”
输出:7

def func12(s):
    res = 0
    center = 0
    from collections import Counter
    s_1 = Counter(s)
    for i in s_1:
        if s_1[i] % 2 == 0:
            res += s_1[i]
        else:
            center = 1
            res += s_1[i] - 1
    return res + center


s = "abccccdd"
print(func12(s))

二、392. 判断子序列

简单

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

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

示例 1:
输入:s = “abc”, t = “ahbgdc”
输出:true

示例 2:
输入:s = “axc”, t = “ahbgdc”
输出:false

解题思路
设置双指针 i , j 分别指向字符串 s , t 的首个字符,遍历字符串 t :
当 s[i] == t[j] 时,代表匹配成功,此时同时 i++ , j++ ;
进而,若 i 已走过 s 尾部,代表 s 是 t 的子序列,此时应提前返回 true ;
当 s[i] != t[j] 时,代表匹配失败,此时仅 j++ ;
若遍历完字符串 t 后,字符串 s 仍未遍历完,代表 s 不是 t 的子序列,此时返回 false 。

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        if not s: 
        	return True
        i = 0
        for c in t:
            if s[i] == c:
                i += 1
                # 若已经遍历完 s ,则提前返回 true
                if i == len(s):
                    return True
        return False

三、521. 最长特殊序列Ⅰ

简单

给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列 的长度。如果不存在,则返回 -1 。
「最长特殊序列」 定义如下:该序列为 某字符串独有的最长子序列(即不能是其他字符串的子序列) 。
字符串 s 的子序列是在从 s 中删除任意数量的字符后可以获得的字符串。
例如,“abc” 是 “aebdc” 的子序列,因为删除 “aebdc” 中斜体加粗的字符可以得到 “abc” 。 “aebdc” 的子序列还包括 “aebdc” 、 “aeb” 和 “” (空字符串)。

示例 1:
输入: a = “aba”, b = “cdc”
输出: 3
解释: 最长特殊序列可为 “aba” (或 “cdc”),两者均为自身的子序列且不是对方的子序列。

示例 2:
输入:a = “aaa”, b = “bbb”
输出:3
解释: 最长特殊序列是 “aaa” 和 “bbb” 。

示例 3:
输入:a = “aaa”, b = “aaa”
输出:-1
解释: 字符串 a 的每个子序列也是字符串 b 的每个子序列。同样,字符串 b 的每个子序列也是字符串 a 的子序列。

def fun0(a, b):
    if a == b:
        return -1
    elif len(a) == len(b):
        return len(a)
    else:
        return max(len(a), len(b))


a = "aba"
b = "aa"
print(fun0(a, b))

四、628. 三个数的最大乘积

简单
给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例 1:
输入:nums = [1,2,3]
输出:6

示例 2:
输入:nums = [1,2,3,4]
输出:24

示例 3:
输入:nums = [-1,-2,-3]
输出:-6

def f(nums):
    v1 = nums[0] * nums[1] * nums[2]
    v2 = nums[-1] * nums[-2] * nums[-3]
    return max(v1, v2)

nums = [-1, -2, -3]
print(f(nums))

你可能感兴趣的:(数据结构与算法,算法,python,开发语言)