Advertisement
Alexxik

Untitled

Sep 12th, 2023 (edited)
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 1.73 KB | None | 0 0
  1. // MARK: - 763 Partition Labels
  2. // Разбить строку на подстроки так чтобы буква встречалась только в одной подстроке (буква одна, а ее кол-во >= 1)
  3.  
  4. // Решение
  5. // Пробежаться по строке и составить словарь [буква : последний индекс где она встречалась]
  6. // Заведем переменные size и end
  7.  
  8.  
  9. func partitionLabels(_ s: String) -> [Int] {
  10.     var s = Array(s).map{String($0)}
  11.     var dict = [String:Int]()
  12.     var result = [Int]()
  13.    
  14.     for (index, char) in s.enumerated() {
  15.         dict[char] = index
  16.     }
  17.    
  18.     // Идем по строке и смотрим в словаре где последний раз встречается буква - там и конец,
  19.     // Если для следующей буквы уонец будет ближе, то не обновляем end.
  20.     // Например, "abba" - end так и останется на 3, так как индекс последнего вхождения b меньше последнего вх а
  21.    
  22.     var end = 0
  23.     var size = 0
  24.    
  25.     for (index, char) in s.enumerated() {
  26.         size += 1
  27.        
  28.         // dict[char] - возвращает позицию последнего вхождения буквы
  29.         let currLastInd = dict[char]!
  30.        
  31.         if currLastInd > end {
  32.             end = currLastInd
  33.         }
  34.         // end = max(currLastInd, end) // или так
  35.        
  36.         if index == end {
  37.             result.append(size)
  38.             size = 0
  39.         }
  40.     }
  41.    
  42.     return result
  43. }
  44.  
  45. partitionLabels("ababcbacadefegdehijhklij")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement