✨【Code皮皮虾】通俗易懂,一次遍历 + 双指针怒解【通过删除字母匹配到字典里最长单词

34 阅读1分钟

Code皮皮虾 一个沙雕而又有趣的憨憨少年,和大多数小伙伴们一样喜欢听歌、游戏,当然除此之外还有写作的兴趣,emm…,日子还很长,让我们一起加油努力叭🌈

话不多说,直达底部有粉丝专享福利!!!


😉毛遂自荐

毛遂自荐一下,给大家推荐一下自己的专栏😁,欢迎小伙伴们收藏关注😊

大厂面试题专栏

Java专栏

爬虫专栏

更多专栏尽在主页,点我😁!!!

在这里插入图片描述


🌝题目

点我 ! 力扣链接
image.png


🔥解题思路

题目要求返回结果——> 如果答案不止一个,返回长度最长且字典序最小的字符串。如果答案不存在,则返回空字符串。

可以得到的信息:1. 返回的字符串长度要长,在长度相等的情况下要字典序最小,2. 返回的字符串是可以通过删除 s 中的某些字符得到。

根据以上信息,可采用模拟法,即遍历 + 双指针

  1. 遍历list,对每一个字符串进行条件判断

  2. 通过双指针判断当前字符串是否可以通过删除 s 中的某些字符得到。


✨代码实现

class Solution {
    public String findLongestWord(String s, List<String> dictionary) {
        
        //双指针
        int left = 0,right = 0;
        //结果字符串
        String res = "";
        int len = dictionary.size();
        int len1 = s.length(),len2 = 0;
        String tmp = "";
        
        //遍历
        for (int i = 0;i < len;i++) {
            left = 0;
            right = 0;
            tmp = dictionary.get(i);
            len2 = tmp.length();
            
            //双指针判断
            while (left < len1 && right < len2) {
                //当前字符相等,指针同时后移
                if (s.charAt(left) == tmp.charAt(right)) {
                    left++;
                    right++;
                }else {
                    //不等则移动左指针
                    left++;
                }
            }

            //如果当前下标索引 == 当前字符串的长度,说明匹配才成功
            if (right == len2) {  
                //第一次,直接赋值
                if ("".equals(res)) {
                    res = tmp;
                    continue;
                }

                //之后,长度优先判断,再才是字典序判断
                if (res.length() < tmp.length()) res = tmp;
                else if(res.length() == tmp.length()) res = res.compareTo(tmp) > 0 ? tmp : res;