美文网首页
剑指 Offer II 017. 含有所有字符的最短字符串

剑指 Offer II 017. 含有所有字符的最短字符串

作者: 邦_ | 来源:发表于2022-04-18 16:30 被阅读0次

滑动窗口
1、如果t的长度为0 或者 s的长度比t的短 不符合条件
2、创建needDict遍历字符串t 记录字符出现的次数。key为字符 value为出现次数
3、创建matchDict记录s中的字符 开始遍历字符串s
如果需要的字典needDict中含有这个字符 就在 matchDict中记录
vaild变量用来记录 是否所有的字符数量符合要求
当数量和需要的字典中相同的时候 说明找到合适的字符串了
记录下开始位置start和长度length,最后返回的时候使用
4、当符合要求的时候 开始移动左指针收紧窗口 寻找最优解
左指针移动 直到移动到需要的字符时 减去所需字符的数量 右指针继续移动 寻找下一个位置
ps:这种的效率不是很高= =。。但是题目中含有大小写字母 用数组的话 要创建一个56长度的= =
要是还含有别的字符呢。。 相对的 这种方法又算是比较好的 不用去考虑字符ASCII码的值


func minWindow(_ s: String, _ t: String) -> String {
        
        if t.count == 0 || s.count < t.count {
            return ""
        }
        

        var needDict = Dictionary<Character,Int>()
        var matchDict = Dictionary<Character,Int>()

        for c in t {
            if let count =  needDict[c] {
                needDict[c] = count + 1
            } else {
                needDict[c] = 1
            }
        }
        //swift字符串没有下标方法 转下数组
        let array = Array(s)
        var left = 0
        var right = 0
        var vaild = 0  //用来判断是否达到条件
        var start = 0
        var length = Int.max  //用来记录长度

        for c in s {
            
            if needDict[c] != nil {
                
                if  let count = matchDict[c]  {
                    
                    matchDict[c] = count + 1
                    
                } else {
                    matchDict[c] = 1
                }
                
                //数量达到要求了
                if matchDict[c] == needDict[c] {
                    
                    vaild += 1
                }
            }
            right += 1
            
            //如果全部达到条件了
           
            while needDict.count == vaild {
                
                //更新长度
                if right - left < length {
                    start = left
                    length = min(length, right - left)

                }
                let d = array[left]
                left += 1

                //开始移动左边界
                if needDict[d] != nil {
                    
                    if matchDict[d] == needDict[d] {
                        vaild -= 1
                    }
                    if  let  count = matchDict[d] {
                        matchDict[d] = count - 1
                    }
                    
                }

            }
            
        }
        
        if length == Int.max {
            return ""
        }
        else{
            
            let  ret = s as NSString
            return  String(ret.substring(with: NSMakeRange(start, length)))
        }
        
       
    
    }




相关文章

网友评论

      本文标题:剑指 Offer II 017. 含有所有字符的最短字符串

      本文链接:https://www.haomeiwen.com/subject/kpdnsrtx.html