给定字符串列表 strs ,返回 它们中 最长的特殊序列 。如果最长特殊序列不存在,返回 -1 。

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

    s 的 子序列可以通过删去字符串 s 中的某些字符实现。

    例如,”abc” 是 “aebdc” 的子序列,因为您可以删除”aebdc”中的下划线字符来得到 “abc” 。”aebdc”的子序列还包括”aebdc”、 “aeb” 和 “” (空字符串)。

    示例 1:

    输入: strs = [“aba”,”cdc”,”eae”]
    输出: 3
    示例 2:

    输入: strs = [“aaa”,”aaa”,”aa”]
    输出: -1

    1. /**
    2. * @param {string[]} strs
    3. * @return {number}
    4. */
    5. var findLUSlength = function (strs) {
    6. let map = new Map(), max = 0, str;
    7. for (let i = 0; i < strs.length; i += 1) {
    8. map.set(strs[i], (map.get(strs[i]) || 0) + 1);
    9. if (strs[i].length > max) {
    10. max = strs[i].length
    11. str = strs[i]
    12. }
    13. }
    14. // 最长字符串是唯一的
    15. if (map.get(str) === 1) {
    16. return max
    17. }
    18. max = -1
    19. // 双指针比较是否是子序列
    20. let compare = function (s, t) {
    21. let i = 0;
    22. let j = 0;
    23. while (i < s.length && j < t.length) {
    24. if (s[i] === t[j]) { j++ }
    25. i++
    26. }
    27. return j === t.length
    28. }
    29. // 取出哈希表中的唯一的字符串与str(最长的字符串)进行比较 判断是否为它的子串
    30. map.forEach((value, key) => {
    31. if (value === 1 && !compare(str, key)) {
    32. max = Math.max(key.length, max)
    33. }
    34. })
    35. return max
    36. };

    image.png