問題:app
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.ide
Example 1:spa
Input: s = "abpcplea", d = ["ale","apple","monkey","plea"] Output: "apple"
Example 2:.net
Input: s = "abpcplea", d = ["a","b","c"] Output: "a"
Note:orm
解決:排序
① 這道題給了咱們一個字符串,和一個字典,讓咱們找到字典中最長的一個單詞,這個單詞能夠經過給定單詞經過刪除某些字符獲得。因爲只能刪除某些字符,並不能從新排序,因此咱們不能經過統計字符出現個數的方法來判斷是否能獲得該單詞,而是隻能老老實實的按順序遍歷每個字符。字符串
咱們能夠給字典排序,經過重寫comparator來實現按長度由大到小來排,若是長度相等的就按字母順序來排。而後咱們開始遍歷每個單詞,用一個變量i來記錄單詞中的某個字母的位置,咱們遍歷給定字符串,若是遍歷到單詞中的某個字母來,i自增1,若是沒有,就繼續往下遍歷。這樣若是最後i和單詞長度相等,說明單詞中的全部字母都按順序出如今了字符串s中,因爲字典中的單詞已經按要求排過序了,因此第一個經過驗證的單詞必定是正確答案,咱們直接返回當前單詞便可。get
class Solution {//32ms
public String findLongestWord(String s, List<String> d) {
if (d == null || d.size() == 0) return "";
String[] dirs = new String[d.size()];
for(int i = 0;i < d.size();i ++){
dirs[i] = d.get(i);
}
Arrays.sort(dirs, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.length() == o2.length()){//按照字典序排序
return o1.compareTo(o2);
}
return o2.length() - o1.length();//按照字符串長度由大到小排序
}
});
for (String str : dirs){
int i = 0;
for (char c : s.toCharArray()){
if (i < str.length() && c == str.charAt(i)) i ++;
}
if (i == str.length()) return str;
}
return "";
}
}input
② 不須要排序的方法,咱們遍歷字典中的單詞,而後仍是跟上面的方法同樣來驗證當前單詞是否能由字符串s經過刪除字符來獲得,若是能獲得,並且單詞長度大於等於結果res的長度,咱們再看是否須要更新結果res,有兩種狀況是必需要更新結果res的,一個是當前單詞長度大於結果res的長度,另外一種是當前單詞長度和res相同,可是字母順序小於結果res,這兩種狀況下更新結果res便可。string
class Solution { //44ms public String findLongestWord(String s, List<String> d) { String res = ""; for (String str : d){ int i = 0; for(char c : s.toCharArray()){ if (i < str.length() && c == str.charAt(i)) i ++; } if (i == str.length() && str.length() >= res.length()){ if (str.length() > res.length() || str.compareTo(res) < 0){ res = str; } } } return res; } }