美文网首页leetcode
这题写的我不想活了-leetcode-76(hard)

这题写的我不想活了-leetcode-76(hard)

作者: 荣荣的靓仔小馒头 | 来源:发表于2020-05-24 17:43 被阅读0次

最小覆盖子串
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:
如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

此题最大的收获应该是使用一个freq变量记录字符数组中每个字符出现的次数。
如果是字符数组,也可以使用定义的int型数组,编译器会根据字符的ASCII码将字符转换成int类型。

本题目也是一个经典的滑动窗口题目:
首先右边界不断扩展,去寻找匹配字符;
设置一个变量match,根据frequncy去统计s中和t匹配的字符个数;
当满足match已经可以等于t的串长时,可以收缩左边界

class Solution {

    public String minWindow(String s, String t) {
    if(s==null||t==null||s.length()==0||t.length()==0) return "";
      int[] freq = new int[200];
      //使用frequency 记录一个字符出现的次数
      int left=0;
      int right=0;
      //substring初始为""
      int start=0;
      int end=0;
      int match=0;//匹配的字符个数
      int minlength = s.length()+1;
      for (char c: t.toCharArray()){
          freq[c]++;
      }
      while(right<s.length()){//right max = s.length-1{
          char charRight = s.charAt(right);
          freq[charRight]--;//表示对于t中已经匹配的字符,对应的frequency减少
          //如果freq不为负数,则说明s中的某个字符也出现在t中
          if(freq[charRight]>=0){
            //匹配 match++
          match++;
          }       
          //为了保证substring包含右边界
          right++;

 //什么时候可以移动:如果存在已经匹配的子串时可以移动
 //条件就是 match==t.length()
       while(match==t.length()){

    //当匹配长度等于t.length,记录此时的start和end,可以对左边界收缩
         //后续循环继续根据match更新start和end
         int size =right-left;
           if(size<minlength){
             minlength=size;
             start=left;
             end=right;
           }

       //如果移出了与t中可以匹配的字符         
         char charLeft = s.charAt(left);
     //不在t中的,freq一直是0
         freq[charLeft]++;    
        if(freq[charLeft]>0) //说明移出了已经可以匹配的字符
        match--;
        left++; 
        }
      }
      return s.substring(start,end);
}
}

相关文章

  • 这题写的我不想活了-leetcode-76(hard)

    最小覆盖子串给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。示例:输入...

  • 我不想活了

    夜深人静。孩子们沉沉地睡了。我辗转难眠。 不想活。不想活。怎么都不想活。 没有病。没有灾。只是心灰意冷了。白天孩子...

  • 我不想活了

    夜 静悄悄 奶奶,孙子 睡的正香 猛然间 窜出一人影 拿着明晃晃的刀子 抵住老人的胸口 “把钱掏出来” 老人急忙找...

  • 我不想活了

    我不想活了 怎么办 我不敢主动求死 我只能祈祷 出门就遇上车祸 那庞然大物 要么直接将我吞没 要么将我碾成粉末 总...

  • 我就是不想好好活

    我想我就是不想好好活了,当然这并不代表我想去死,我只是不想按照大家认为的那样好好地去生活了,我想堕落,我想自我放弃...

  • 妈妈,我不想活了

    暑假了。 麦兜一直在家躺着,不吃饭,不写作业,不出门,就是纯睡,偶尔醒来会叫嚷着好无聊啊!几句之后再次倒头大睡。 ...

  • 妈妈我不想活了

    妈妈,每天作业太多,压力太大。有些东西学过的,但时间太久,忘了一些,想起来很费脑,又耗时,我担心自己长不大了。如此...

  • 我不想活了啊

    我不想活了啊,活着太累了。我不想看见明天的太阳。

  • 我不想分享我的生活了

    说好的,为了宝宝,开始努力,发奋图强 然后,好像当时是有认真学习 学到第三天得时候,跟一个刚好有过自考经历的朋友在...

  • 开心日历4

    不能够学习我也很难过。 我还是不想活了 我真的不想活了

网友评论

    本文标题:这题写的我不想活了-leetcode-76(hard)

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