【Leetcode -521.最长特殊序列 -541.反转字符串Ⅱ】

简介: 【Leetcode -521.最长特殊序列 -541.反转字符串Ⅱ】

Leetcode -521.最长特殊序列

题目:给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列的长度。如果不存在,则返回 - 1 。

「最长特殊序列」 定义如下:该序列为 某字符串独有的最长子序列(即不能是其他字符串的子序列) 。

字符串 s 的子序列是在从 s 中删除任意数量的字符后可以获得的字符串。

例如,“abc” 是 “aebdc” 的子序列,因为删除 “aebdc” 中的字符 e 和 d 可以得到 “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 的子序列。

思路是在两个字符串不相同的情况下,返回长度长的那个字符串的长度;相同就返回 -1;

int findLUSlength(char* a, char* b)
    {
        //由题意,在两个字符串不相同的情况下,返回长度长的那个字符串的长度
        int lenA = strlen(a), lenB = strlen(b);
        int max = lenA > lenB ? lenA : lenB;
        //如果相同,返回-1
        if (!strcmp(a, b))
            return -1;
        return max;
    }

Leetcode - 541.反转字符串Ⅱ

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

如果剩余字符少于 k 个,则将剩余字符全部反转。

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

示例 1:

输入:s = “abcdefg”, k = 2

输出:“bacdfeg”

示例 2:

输入:s = “abcd”, k = 2

输出:“bacd”

思路是遍历字符串,每次走 2k 步,然后反转前 k 个字符,利用 i + k 找到第 k + 1 个,在反转前 k 个字符之前,判断 i + k 是否大于字符串的长度,比较它们的长度,取较小值;

//交换字符
    void swap(char* a, char* b)
    {
        char tmp = *a;
        *a = *b;
        *b = tmp;
    }
    //更新迭代字符
    //注意 right 传进来的时候是 i + k 或者字符串的长度,在交换字符之前需要先自减
    //假设传进来的是 i + k ,i + k - 1 才是前 k 个;
    void reverse(char* left, char* right)
    {
        while (left < right)
        {
            swap(left++, --right);
        }
    }
    //min函数取较小的值
    int min(int a, int b)
    {
        return a < b ? a : b;
    }
    char* reverseStr(char* s, int k)
    {
        /* 从头开始遍历,i每次走 2k 步,然后反转前k个;
           在反转前 k 个字符之前,判断 i + k 是否大于字符串的长度,取它们的较小值;
           注意要用传址的形式,因为需要改变到字符串中的字符 */
        for (int i = 0; i < strlen(s); i += 2 * k)
        {
            reverse(&s[i], &s[min(i + k, strlen(s))]);
        }
        return s;
    }
目录
相关文章
|
4月前
|
Python
【Leetcode刷题Python】376. 摆动序列
文章提供了解决LeetCode "摆动序列" 问题的Python实现代码,通过遍历整数数组并使用两个变量 down 和 up 来记录正差和负差摆动序列的长度,最终返回最长摆动子序列的长度。
43 0
|
2月前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
36 1
|
2月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
25 9
|
2月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
20 0
|
2月前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
30 0
|
2月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
20 0
|
2月前
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
22 0
|
2月前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
16 0
|
4月前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘
|
4月前
|
算法 Java
LeetCode第28题找出字符串中第一个匹配项的下标
这篇文章介绍了LeetCode第28题"找出字符串中第一个匹配项的下标"的两种解法:暴力解法和KMP算法,并解释了KMP算法通过构建前缀表来提高字符串搜索的效率。
LeetCode第28题找出字符串中第一个匹配项的下标