Longest Uncommon Subsequence(最长非公共子序列)
题目描述:
给定两个字符串,找到两个字符串的最长非公共子序列。其中子序列的定义为:原序列中删除部分字符所得到,即原始序列中的字符顺序不改变。即假设字符串str1和str2。找到str1中的最长子序列,且该序列无法由str2得到。另外我们设定str1和””都是str1的子序列。如果”aa”和”aa”的话,不存在非公共子序列,返回-1.
例子:
“abc”和”cdc”的最长子序列是”abc”(“cdc”)。所以最长的非公共子序列长度为3.见LeetCode521
解题思路:
初看题目会陷入困局;想要找到”abc”中的所有子序列然后和”cdc”一一验证。但是其实我们从另外一个角度看,我们可以先将两个字符串相同的情况排除后;在两个字符串不同长度的情况下,肯定是较长的字符串的本身是我们需要的结果。因为较长的字符串肯定无法通过另外一个串得到,所以较长的串就是我们所求的。
代码如下:
|
|
Longest Uncommon Subsequence II(最长非公共子序列)
题目描述:
给定一个字符串数组,找到字符串数组中的最长非公共子序列。
例子:
“abc”, “cde”, “fgh”的最长公共子序列的长度是3,任意的一个字符串都是最长非公共子序列。
解题思路:
与上一题类似,我们想直接利用最长的那个字符来作为结果返回;但是”aaa”,”aaa”,”bb”这样的情况导致结果不符合题意;所以需要利用哈希表来过滤掉超过两次的字符串;但是仅仅这样还是不够;因为如果输入是”aaa”,”aaa”,”aa”这样的情况下是不存在所谓的非公共子序列。所以思路是我们找到一个字符串,判断它是否是最长公共子序列的方法是与比它长的字符串比较,只有它不是所有比它长的字符串的子序列才可以成为最长子序列。
代码如下:
|
|