1. 程式人生 > >[Swift]LeetCode524. 通過刪除字母匹配到字典裏最長單詞 | Longest Word in Dictionary through Deleting

[Swift]LeetCode524. 通過刪除字母匹配到字典裏最長單詞 | Longest Word in Dictionary through Deleting

bool == lse 包含 rap 字典順序 mem ogr con

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.

給定一個字符串和一個字符串字典,找到字典裏面最長的字符串,該字符串可以通過刪除給定字符串的某些字符來得到。如果答案不止一個,返回長度最長且字典順序最小的字符串。如果答案不存在,則返回空字符串。

示例 1:

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

輸出: 
"apple"

示例 2:

輸入:
s = "abpcplea", d = ["a","b","c"]

輸出: 
"a"

說明:

  1. 所有輸入的字符串只包含小寫字母。
  2. 字典的大小不會超過 1000。
  3. 所有輸入的字符串長度不會超過 1000。

340ms

 1 class Solution {
 2     func findLongestWord(_ s: String, _ d: [String]) -> String {
 3     var result : [Character] = []
 4     let s = Array(s)
 5     for str in d {
 6         var str = Array(str)
 7         if str.count < result.count{
 8             continue
 9         }
10         
11         if canBeFoundFrom(s: s, with: Array(str)){
12             if str.count > result.count{
13                 result = str
14             }else if str.count == result.count{
15                 result = lexicoOrder(result, str)
16             }
17             
18         }
19     }
20     
21     return String(result)
22 }
23 
24 func lexicoOrder(_ first : [Character], _ second : [Character])->[Character]{
25     
26     var firstIndex : Int = 0
27     var secondIndex : Int = 0
28     
29     while firstIndex < first.count{
30         if first[firstIndex] == second[secondIndex]{
31             firstIndex += 1
32             secondIndex += 1
33         }else if first[firstIndex] < second[secondIndex]{
34             return first
35         }else{
36             return second
37         }
38     }
39     return first
40 }
41 
42 func canBeFoundFrom(s : [Character], with d : [Character])->Bool{
43     
44     
45     var sIndex : Int = 0
46     var dIndex : Int = 0
47     while sIndex < s.count{
48         if d[dIndex] == s[sIndex]{
49             dIndex += 1
50         }
51         sIndex += 1
52         if dIndex == d.count{
53             return true
54         }
55     }
56     
57     return dIndex == d.count
58   }
59 }

532ms

 1 class Solution {
 2      func findLongestWord(_ s: String, _ d: [String]) -> String {
 3         if d.count == 0 {
 4             return ""
 5         }
 6 
 7         var long = ""
 8         for items in d {
 9             let i = long.count
10             let j = items.count
11             if i > j || (i == j && long < items) {
12                 continue
13             }
14             if isValid(s: s, d: items) {
15                 long = items
16             }
17         }
18         
19         return long
20     }
21     
22     fileprivate func isValid(s: String, d: String) -> Bool {
23         var i = 0
24         var j = 0
25         var source = Array(s)
26         var target = Array(d)
27         var result = ""
28         while i < source.count && j < target.count {
29             if source[i] == target[j] {
30                 j += 1
31                 result.append(source[i])
32             }
33             i += 1
34         }
35         return j == target.count
36     }
37 }

840ms

 1 class Solution {
 2     func findLongestWord(_ s: String, _ d: [String]) -> String {
 3     
 4     let sortedD = d.sorted { (first, second) -> Bool in
 5         if first.count > second.count{
 6             return true
 7         }else if first.count == second.count{
 8             return first < second
 9         }else{
10             return false
11         }
12     }
13     
14     for str in sortedD{
15         if possibleToForm(s, str: str){
16             return str
17         }
18     }
19     return ""
20 }
21 
22 func possibleToForm(_ base : String, str : String)->Bool{
23     guard  base.count >= str.count else {
24         return false
25     }
26     
27     var baseIndex : String.Index = base.startIndex
28     var strIndex : String.Index = str.startIndex
29     
30     while baseIndex != base.endIndex && strIndex != str.endIndex{
31         if str[strIndex] == base[baseIndex]{
32             strIndex = str.index(after: strIndex)
33         }
34          baseIndex = base.index(after: baseIndex)
35     }
36     
37     return strIndex == str.endIndex
38   }
39 }

Runtime: 7968 ms Memory Usage: 20.7 MB
 1 class Solution {
 2     func findLongestWord(_ s: String, _ d: [String]) -> String {
 3         var res:String = String()        
 4         for str in d
 5         {
 6             var arr:[Character] = Array(str)
 7             var i:Int = 0
 8             for c in s.characters
 9             {
10                 if i < str.count && c == arr[i]
11                 {
12                     i += 1
13                 }
14             }
15             if i == str.count && str.count >= res.count
16             {
17                 if str.count > res.count || str < res
18                 {
19                     res = str
20                 }
21             }   
22         }
23         return res
24     }
25 }

[Swift]LeetCode524. 通過刪除字母匹配到字典裏最長單詞 | Longest Word in Dictionary through Deleting