LeetCode第524题:通过删除字母匹配到字典里最长单词&最长子序列

题干

给你一个字符串 s 和一个字符串数组 dictionary 作为字典,找出并返回字典中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。

如果答案不止一个,返回长度最长且字典序最小的字符串。如果答案不存在,则返回空字符串。

实例:

输入:s = "abpcplea", dictionary = ["ale","apple","monkey","plea"]
输出:"apple"
复制代码

解法:双指针

此题分为两部分,第一部分是在字典中寻找符合我们要求的元素,这一部分我是使用了双指针的做法,在每一次循环结束前将此次得到的结果,与上一个我们存储的目标值进行比较,长度长者胜出,留下,然后进行下一个对比,接下来就是第二部分,如果我们得到的目标值是相等的,那么就需要我们再次对于这两个字符串的字典序进行比较,然后返回字典序较小的值

注意:这里的字典序不是ASCII码,准确来说是字母的顺序,比如"bab", ["ba", "ab", "a", "b"]就要返回ab,很明显对于这两个长度长度相同的字符串我们比较的是这两者的字母顺序。这里我采用的也是双指针的做法。

代码:

/**
 * @param {string} s
 * @param {string[]} dictionary
 * @return {string}
 */
  var findLongestWord = function (s, dictionary) {
        // 存储所有符合条件的tartget
        let targetStr = ''
        // 先遍历字典
        for (let i = 0; i < dictionary.length; i++) {
            // 分别定义预目标与两个指针变量,其中index1是s的指针,index2是预目标的指针
            let readyTarget = dictionary[i];
            let index1 = 0;
            let index2 = 0;
            while (index1 < s.length) {
                if (s[index1] == readyTarget[index2]) {
                    index1++;
                    index2++;
                } else {
                    index1++
                }
            }
            // 符合条件比较,如果长度不等,则直接返回
            if (index2 == dictionary[i].length) {
                if (targetStr.length < dictionary[i].length) {
                    targetStr = dictionary[i]
                } else if (targetStr.length == dictionary[i].length) {
                        targetStr = GetStringNum(targetStr,dictionary[i])
                }
            }
        }
        return targetStr
    };
    function GetStringNum(preString, nextString) {
        let index1 = 0, index2 = 0;
        let length = preString.length
        while (index1 < length || index2 < length) {
            if (preString[index1].charCodeAt()>nextString[index2].charCodeAt()) {
                return nextString
            }else if(preString[index1].charCodeAt()<nextString[index2].charCodeAt()){
                return preString
            }
            index1++;
            index2++;
        }
        return preString
    }
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享