LeetCode 521. 最长特殊序列 Ⅰ

165 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列  。如果不存在,则返回 -1 。「最长特殊序列」 定义如下:该序列为 某字符串独有的最长子序列(即不能是其他字符串的子序列) 。字符串 s 的子序列是在从 s 中删除任意数量的字符后可以获得的字符串。

例如,"abc" 是 "aebdc" 的子序列,因为删除 "aebdc" 中斜体加粗的字符可以得到 "abc" 。 "aebdc" 的子序列还包括 "aebdc" 、 "aeb" 和 "" (空字符串)。

这道题很容易迷惑到大家,其实思路是非常简单的,我们举几个例子就明白了。

对于两个字符串a和b,无非只有如下几种情况:

  1. 字符串a长度 > 字符串b长度
  2. 字符串a长度 < 字符串b长度
  3. 字符串a长度 = 字符串b长度,且内容不相同
  4. 字符串a长度 = 字符串b长度,且内容相同

我们分别来讨论一下,对于情况一,举个例子:

a = "abcd", b = "abc"

在字符串a中,abcd即为最长子序列,而该子序列在字符串b中是不可能存在的,因此是独有的子序列。

由此得出结论,对于长度更长的字符串而言,其本身就是两个字符串中的最长特殊序列

所以情况二中,最长特殊序列为字符串b本身。

而当字符串a和b长度相等的时候,我们得分两种情况讨论,当字符串a、b内容相同,如:

a = "abc", b = "abc"

此时是没有最长特殊序列的。

而当字符串a、b内容不相同时,如:

a = "abc", b = "bcd"

对于这种情况,a本身就是最长特殊序列,b本身也是最长特殊序列,所以任意取一个字符串的长度即可。

综上所述,代码如下:

public static int findLUSlength(String a, String b) {
    if (a.equals(b)) {
        // 若字符串a、b相同,则无最长特殊序列
        return -1;
    } else {
        // 否则,返回更长的字符串长度
        return Math.max(a.length(), b.length());
    }
}

此题得解。