5 leetcode双指针:JavaScript实现l最长子序列(通过删除字母匹配到字典里最长单词)

1 题目

https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting/description/

给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。

2 示例

示例 1:

输入:

s = "abpcplea", d = ["ale","apple","monkey","plea"]

输出:

"apple"

 

示例 2:

输入:

s = "abpcplea", d = ["a","b","c"]

输出:

"a"

 

说明:

所有输入的字符串只包含小写字母。

字典的大小不会超过 1000。

所有输入的字符串长度不会超过 1000。

3 解析:双指针方法寻找字符串是另外一个字符串的子字符串

1)问题中匹配的条件是我们需要考虑字典中能匹配的最长字符串,相同长度的情况下考虑字典序最小的。为了简化搜索过程,我们把字典中的字符串按照这一规则排序,这样越靠前的字符串是我们越优先考虑的。

现在,与其删除 ss 中的字符,我们直接从头开始检查字典中的单词是否是 ss 串的子序列。这是因为,如果 xx 是 ss 的子序列,我们可以直接通过删除 ss 中的某些字符得到 xx 。(使用双指针方法判断一个一个字符串是不是另外一个字符串的子序列)

2)直接在未排序的字典 dd 中查找字符串 xx 满足 xx 是 ss 的子序列。如果 xx 被找到了,我们将它与其他匹配的字符串做比较,直到找到长度最长、字典序最小的单词为止。

4 代码

//方法1
//函数isSubsequence()功能是看一个字符串是不是另外一个字符串删除若干字符得来的
function isSubsequence(str, target) {
    /*变量i从左往右遍历字符串str;从左往右遍历,j(小于等于target的长度)记录str和target相同字符的个数。
    如果最后变量j与target长度相等,则说明target是str串删除若干字符得来的
    */
    var i = 0;
    var j = 0;   //从左往右遍历,j表示str和target相同字符的个数
    while(i < str.length && j < target.length){
        if(str[i] === target[j]){
            j++;
        }
        i++;
    }
    return j === target.length;
}

var findLongestWord = function (str, dits) {
    //str是给定的字符串,dits是字符串字典(数组)
    var longWord = ""; //用来保存当前合适的最长字符串,初始化为空字符串
    for(var i = 0; i < dits.length; i++){
        //对字符串数组dits进行遍历,寻找最合适的项
        if (isSubsequence(str, dits[i])){
            if (longWord.length < dits[i].length || (longWord.length === dits[i].length) && longWord > dits[i]){
                //longWord长度更小时,或者longWord长度相等,字典顺序(不是数组下标)更大时,更新
                longWord = dits[i];
            }
        }
    }
    return longWord;
};

 

//方法2
//函数isSubsequence()功能是看一个字符串是不是另外一个字符串删除若干字符得来的
function isSubsequence(str, target) {
    var i = 0;
    var j = 0;   //从左往右遍历,j表示str和target相同字符的个数
    while(i < str.length && j < target.length){
        if(str[i] === target[j]){
            j++;
        }
        i++;
    }
    return j === target.length;
}


var findLongestWord2 = function (str, dits) {
    //str是给定的字符串,dits是字符串字典(数组)
    dits.sort(function (str1, str2) {
        //对字符串数组dits进行按题目规则排列好(越往左长度越长,字典顺序越小)
        if(str1.length < str2.length ||(str1.length === str2.length && str1 > str2 )){
            return 1;
        } else if(str1.length === str2.length && str1 === str2){
            return 0;
        }else{
            return -1;
        }
    });
    var longWord = ""; //用来保存合适的最长字符串,初始化为空字符串
    var j = 0;
    while(j < dits.length){
        //因为dits以及按规则排序好了,所以只有找到第一个是str子序列的项就是题目要求的
        if(isSubsequence(str, dits[j])) {
            return longWord = dits[j];
        }
        j++;
    }
    return "";
};

如果有错,请您指出!如有侵权,请联系我删除!

参考:

1)GitHub:https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E5%8F%8C%E6%8C%87%E9%92%88.md#7-%E6%9C%80%E9%95%BF%E5%AD%90%E5%BA%8F%E5%88%97

2)力扣

https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting/description/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值