zoukankan      html  css  js  c++  java
  • [Swift]LeetCode316. 去除重复字母 | Remove Duplicate Letters

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10260578.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.

    Example 1:

    Input: "bcabc"
    Output: "abc"
    

    Example 2:

    Input: "cbacdcbc"
    Output: "acdb"

    给定一个仅包含小写字母的字符串,去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

    示例 1:

    输入: "bcabc"
    输出: "abc"
    

    示例 2:

    输入: "cbacdcbc"
    输出: "acdb"

    32ms
     1 class Solution {
     2     func removeDuplicateLetters(_ s: String) -> String {
     3         
     4         var counts = [Character: Int]()
     5         var used = [Character:Bool]()
     6         
     7         s.forEach {
     8             counts[$0, default: 0] += 1
     9         }
    10         
    11         var ans = [Character]()
    12         
    13         for ch in s {
    14             counts[ch, default:0] -= 1
    15             if used[ch, default: false] == true {
    16                 continue
    17             }                      
    18             
    19             while let last = ans.last, ch < last, counts[last]! > 0 {
    20                 used[last] = false
    21                 ans.removeLast()           
    22             }
    23             ans.append(ch)
    24             used[ch] = true
    25         }
    26 
    27         return String(ans)
    28     }
    29 }

    36ms

      1 extension Character {
      2     var ascii: UInt32? {   
      3         guard let first = unicodeScalars.first else {
      4             return nil
      5         }
      6         return first.isASCII == true ? first.value : nil    
      7     }
      8 }
      9 
     10 class Solution {
     11     class IndexedTree {
     12         var n: Int
     13         var arr: [Int]
     14         
     15         init(_ n: Int) {
     16             self.n = n
     17             arr = [Int](repeating: 0, count: n+1)
     18         }
     19         
     20         func insert(_ index: Int) -> Void {
     21             var x = index
     22             while x <= n {
     23                 arr[x] += 1
     24                 x = x + x&(-x)
     25             }
     26         }
     27         
     28         func query(_ index: Int) -> Int {
     29             var x = index
     30             var sum = 0
     31             while x > 0 {
     32                 sum += arr[x]
     33                 x = x&(x-1)
     34             }
     35             return sum
     36         }
     37     }
     38     
     39 
     40     func transIndex(_ n: Int, _ index: Int) -> Int {
     41         return n-index
     42     }
     43     
     44     func removeDuplicateLetters(_ s: String) -> String {
     45         let charArr = Array(s)
     46         var ans = ""
     47         
     48         let n = charArr.count
     49         if n == 0 {
     50             return ans
     51         }
     52         
     53         var counts = [Int](repeating: 0, count: 26)
     54         var indice = [Int?](repeating: nil, count: 26)
     55         var used = [Bool](repeating: false, count: 26)
     56         
     57         let indexedTree = IndexedTree(charArr.count)
     58         let aAsc = "a".first!.ascii!
     59         
     60         for (i, ch) in charArr.enumerated(){
     61             let ci = Int(ch.ascii!-aAsc)
     62             counts[ci] += 1
     63         }
     64         
     65         var que = [Int]()
     66         for (i, ch) in charArr.enumerated() {
     67             let ci = Int(ch.ascii!-aAsc)
     68             if counts[ci] == 0 {
     69                 continue
     70             }
     71 
     72 
     73             
     74             if indice[ci] == nil {
     75                 while let last = que.last {
     76                     if last > ci {
     77                         que.removeLast()
     78                         indice[last] = nil
     79                     } else {
     80                         break
     81                     }
     82                 }
     83                 
     84                 indice[ci] = i
     85                 que.append(ci)
     86             }
     87             
     88             counts[ci] -= 1
     89             if counts[ci] == 0 {
     90                 while let ii = que.first, ii <= ci {
     91                     let index = indice[ii]!
     92                     ans += String(charArr[index])
     93                     indice[ii] = nil
     94                     counts[ii] = 0
     95                     que.removeFirst()
     96                 }
     97             }
     98 
     99         }
    100     
    101         return ans
    102     }
    103 }

    52ms

     1 class Solution {
     2     func removeDuplicateLetters(_ s: String) -> String {
     3         let sArr = Array(s)
     4         
     5         var counts = [Character : Int]()
     6         
     7         for c in sArr {
     8             if counts[c] == nil {
     9                 counts[c] = 1
    10             }else {
    11                 counts[c]! += 1
    12             }
    13         }
    14         
    15         var res = [Character]()
    16         
    17         for c in sArr {
    18             if !res.contains(c) {
    19                 while !res.isEmpty && counts[res.last!] != 0 && res.last! > c  {
    20                     res.removeLast()
    21                 }
    22                 res.append(c)
    23                 
    24             }
    25             counts[c]! -= 1
    26         }
    27         
    28         return String(res)
    29     }
    30 }
  • 相关阅读:
    C#中的const和readonly之间的不同(转)
    文字在状态栏上从右往左显示,而且是循环的
    文字在状态栏上从左往右一个一个地显示
    猛然发现,已经第100篇随笔了
    怎样使按钮响应回车键
    编程之我见(二 类库)初露牛角
    编程之我见(一 语言)小试牛刀
    开始→运行→输入的命令集锦(转)收藏
    显示走动的数字时间和显示星期,年,月,日
    在两个页面之间互相写其控件内的值
  • 原文地址:https://www.cnblogs.com/strengthen/p/10260578.html
Copyright © 2011-2022 走看看