522. 最长特殊序列 II

给定字符串列表,你需要从它们中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。

子序列可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。

输入将是一个字符串列表,输出是最长特殊序列的长度。如果最长特殊序列不存在,返回 -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;
    }
}

结果如下:

你可能感兴趣的:(522. 最长特殊序列 II)