力扣刷题记录——521. 最长特殊序列 Ⅰ、541. 反转字符串 II、557. 反转字符串中的单词 III

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《521. 最长特殊序列 Ⅰ、541. 反转字符串 II、557. 反转字符串中的单词 III》。

目录

521. 最长特殊序列 Ⅰ

        题目描述

        解题思路

        解题代码

541. 反转字符串 II

        题目描述

        解题思路

        解题代码

557. 反转字符串中的单词 III

        题目描述

        解题思路

        解题代码


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 的子序列。

解题思路

如果两字符串不相同,首先判断那个是长字符串哪个是短字符串,最长特定序列一定在长的字符串中,只要遍历长的字符串,如果在短的里面存在,replase掉就可以,最终返回最长的字符串。如果这种方法不行,可以再尝试一下指针的方法

解题代码

def findLUSlength(a: str, b: str):
    if a==b:
        return -1
    if len(a)<= len(b):
        min_str = a
        max_str = b

    else:
        min_str = b
        max_str = a
    for i in max_str:
        if i in min_str:
            max_str.replace(i,"")
            min_str.replace(i,"")
    return len(max_str)

力扣刷题记录——521. 最长特殊序列 Ⅰ、541. 反转字符串 II、557. 反转字符串中的单词 III_第1张图片

顺利通关,击败率还挺高!

541. 反转字符串 II

题目描述

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"

解题思路

首先通过while循环将列表分割,再通过遍历列表,根据i的长度进行不同的操作,注意在刚开始时要判断s和k的关系,最终返回一个result。

解题代码

def reverseStr(s: str, k: int):
    print(len(s))
    if len(s) < k:
        return s
    begin = 0
    tem_list = []
    result = ""
    while begin < len(s):
        tem_list.append(s[begin:begin+2*k])
        begin += 2*k
    for i in tem_list:
        if len(i) < k:
            i = i[::-1]
            result += i
        elif len(i) == 2*k:
            first = i[:k]
            first = first[::-1]
            result += "".join(first)
            second = i[k:2*k]
            result += "".join(second)
        else:
            first = i[:k]
            first = first[::-1]
            result += "".join(first)
            second = i[k:]
            result += "".join(second)
    return result

力扣刷题记录——521. 最长特殊序列 Ⅰ、541. 反转字符串 II、557. 反转字符串中的单词 III_第2张图片

557. 反转字符串中的单词 III

题目描述

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:

输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

示例 2:

输入: s = "God Ding"
输出:"doG gniD"

解题思路

这题还是很基础的,用split切割,然后用字符串 切片倒序就可以,注意在添加末尾加上一个空格,然后最后的结果再去掉末尾的空格,返回result。

解题代码

def reverseWords(s: str):
    str_list = [i for i in s.split(" ")]
    result = ""
    for i in str_list:
        i = i[::-1]
        result += i +" "
    result = result[:-1:]

    return result

力扣刷题记录——521. 最长特殊序列 Ⅰ、541. 反转字符串 II、557. 反转字符串中的单词 III_第3张图片

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