[LeetCode] Longest Word in Dictionary through Deleting 刪除后得到的字典中的最長單詞


 

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.

 

這道題給了我們一個字符串,和一個字典,讓我們找到字典中最長的一個單詞,這個單詞可以通過給定單詞通過刪除某些字符得到。由於只能刪除某些字符,並不能重新排序,所以我們不能通過統計字符出現個數的方法來判斷是否能得到該單詞,而是只能老老實實的按順序遍歷每一個字符。我們可以給字典排序,通過重寫comparator來實現按長度由大到小來排,如果長度相等的就按字母順序來排。然后我們開始遍歷每一個單詞,用一個變量i來記錄單詞中的某個字母的位置,我們遍歷給定字符串,如果遍歷到單詞中的某個字母來,i自增1,如果沒有,就繼續往下遍歷。這樣如果最后i和單詞長度相等,說明單詞中的所有字母都按順序出現在了字符串s中,由於字典中的單詞已經按要求排過序了,所以第一個通過驗證的單詞一定是正確答案,我們直接返回當前單詞即可,參見代碼如下:

 

解法一:

class Solution {
public:
string findLongestWord(string s, vector<string>& d) {
sort(d.begin(), d.end(), [](
string a, string b){
if (a.size() == b.size()) return a < b;
return a.size() > b.size();
});
for (string str : d) {
int i = 0;
for (char c : s) {
if (i < str.size() && c == str[i]) ++i;
}
if (i == str.size()) return str;
}
return "";
}
};

 

上面的方法中用到了sort排序,會占用大量時間,如果我們想進一步優化,就可以不用排序。我們遍歷字典中的單詞,然后還是跟上面的方法一樣來驗證當前單詞是否能由字符串s通過刪除字符來得到,如果能得到,而且單詞長度大於等於結果res的長度,我們再看是否需要更新結果res,有兩種情況是必須要更新結果res的,一個是當前單詞長度大於結果res的長度,另一種是當前單詞長度和res相同,但是字母順序小於結果res,這兩種情況下更新結果res即可,參見代碼如下:

 

解法二:

class Solution {
public:
string findLongestWord(string s, vector<string>& d) {
string res = "";
for (string str : d) {
int i = 0;
for (char c : s) {
if (i < str.size() && c == str[i]) ++i;
}
if (i == str.size() && str.size() >= res.size()) {
if (str.size() > res.size() || str < res) {
res
= str;
}
}
}
return res;
}
};

 

參考資料:

https://discuss.leetcode.com/topic/80876/10-lines-solutions-for-c

https://discuss.leetcode.com/topic/80799/short-java-solutions-sorting-dictionary-and-without-sorting/2

 

LeetCode All in One 題目講解匯總(持續更新中...) 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: