给定字符串列表,你需要从它们中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。
子序列可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。
输入将是一个字符串列表,输出是最长特殊序列的长度。如果最长特殊序列不存在,返回 -1 。
示例:
输入: "aba", "cdc", "eae"
输出: 3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-uncommon-subsequence-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题方法及思路
因为肯定最长的特殊序列是数组中的某一个字符串,所以使用双指针记录,双循环控制。如果外层循环i指向的字符串是内层循环j指向的字符串的字串,break内层循环,继续下一次外层循环。说明i指向的字符串不是最长的特殊序列。如果内层循环完,j == 数组长度,说明i指向的字符串满足最长的特殊序列的条件,判断大小,进行下一次外层循环。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* @author abean
* @Description 给定字符串列表,你需要从它们中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。
*
* 子序列可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。
*
* 输入将是一个字符串列表,输出是最长特殊序列的长度。如果最长特殊序列不存在,返回 -1 。
*
*
*
* 示例:
*
* 输入: "aba", "cdc", "eae"
* 输出: 3
*
* @date 2021/9/21-17:57
*/
public class Solution {
public int findLUSlength(String[] strs) {
int res = -1;
for (int i = 0, j; i < strs.length; i++) {
for (j = 0; j < strs.length; j++) {
if (j == i)
continue;
if (isSubsequence(strs[i], strs[j]))
break;
}
if (j == strs.length)
res = Math.max(res, strs[i].length());
}
return res;
}
// 判断s是否t的字串
public boolean isSubsequence(String s, String t) {
if (s.length() == 0) {
return true;
}
// 记录下标
int cnt_s = 0, cnt_t = 0;
// 逐位比较
while (cnt_t < t.length()) {
if (s.charAt(cnt_s) == t.charAt(cnt_t)) {
cnt_s++;
}
cnt_t++;
// s是t的字串
if (cnt_s == s.length()) {
return true;
}
}
return false;
}
}
结果如下: