zoukankan      html  css  js  c++  java
  • leetcode524- Longest Word in Dictionary through Deleting- medium

    Given a string and a string dictionary, find the longest string in the dictionary that can be formed by deleting some characters of the given string. If there are more than one possible results, return the longest word with the smallest lexicographical order. If there is no possible result, return the empty string.

    Example 1:

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

    Example 2:

    Input:
    s = "abpcplea", d = ["a","b","c"]
    
    Output: 
    "a"
    

    Note:

    1. All the strings in the input will only contain lower-case letters.
    2. The size of the dictionary won't exceed 1,000.
    3. The length of all the strings in the input won't exceed 1,000.

    算法。基本思路是遍历整个词典里的单词,拿着这个单词word去给入的新字符串s找每个word内字母有没有按顺序出现过。检查按顺序的方法有两种

    1.用indexOf()每次更新。每次在后一点的位置开始找word的下一个字母。

    2.(更简单)通过遍历s内的每个字母不断+1,同时一个指针指着word的字母偶尔+1,如果找到字符对上了,word的指针加上去,等到s的字母都走完了如果word的指针还没走到最后的话,就不合格。最后合格的word打个擂台就好。

    时间复杂度:O(nk)。n是字符串长度,k是字典里单词个数。

    细节:要求字典序比较方法是直接s1.compareTo(s2)

    实现1:用indexOf的

    class Solution {
        public String findLongestWord(String s, List<String> d) {
            String result = "";
            if (s == null || d == null || d.size() == 0) {
                return result;
            }
    
            for (String word : d) {
                int index = -1;
                int i = 0;
                for (i = 0; i < word.length(); i++) {
                    index = s.indexOf(word.charAt(i), index);
                    if (index == -1) {
                        break;
                    }
                    index++;
                }
                if (index != -1 && (word.length() > result.length() 
                                    || word.length() == result.length() && word.compareTo(result) < 0)) {
                        result = word;
                }
            }
            return result;
        }
    }

    实现2:指针遍历

    public String findLongestWord(String s, List<String> d) {
        String longest = "";
        for (String dictWord : d) {
            int i = 0;
            for (char c : s.toCharArray()) 
                if (i < dictWord.length() && c == dictWord.charAt(i)) i++;
    
            if (i == dictWord.length() && dictWord.length() >= longest.length()) 
                if (dictWord.length() > longest.length() || dictWord.compareTo(longest) < 0)
                    longest = dictWord;
        }
        return longest;
    }
  • 相关阅读:
    [转] 美股评论:远离波动的噪音
    [转] GDB 下 watch的使用
    [转] Web性能压力测试工具之ApacheBench(ab)详解
    [转] Ubuntu 12.04下LAMP安装配置 (Linux+Apache+Mysql+PHP)
    [转] 在 Linux 中怎样使用cp命令合并目录树
    [转] postgresql常用命令
    [转] 跟着美联储投资
    [转] 智能指针(三):unique_ptr使用简介
    关于前端开发
    [转] 美股评论:美国散户血泪辛酸
  • 原文地址:https://www.cnblogs.com/jasminemzy/p/7985885.html
Copyright © 2011-2022 走看看