LeetCode最小窗口子字符串以及求解子字符串模板

LeetCode原题地址

题干:

给定字符串S和T,以O(n)复杂度在S中找出包含T中所有字符的最小窗口子字符串。

示例:

S = "ADOBECODEBANC"
T = "ABC"

最小窗口是"BANC".

备注:

如果没有结果,返回空字符串""。

如果有多个窗口,保证只有一个最小解。

Discuss中的答案(并且给出了一个求解所有子字符串问题的模板):

原题的解:

 1 string minWindow(string s, string t) {
 2         vector<int> map(128,0);
 3         for(auto c: t) map[c]++;
 4         int counter = t.size(), begin = 0, end = 0, d = INT_MAX, head = 0;
 5         while(end<s.size()){
 6             if(map[s[end++]]-- > 0) counter--; //in t
 7             while(counter == 0){ //valid
 8                 if(end - begin < d)  d = end - (head = begin);
 9                 if(map[s[begin++]]++ == 0) counter++;  //make it invalid
10             }
11         }
12         return d==INT_MAX? "":s.substr(head, d);
13     }

上面的代码要理解两点:

1.自增语句,i++是i先不自加,在语句完后自加。

2.vector<int> map(128,0)可以理解为一个数组,也可以理解为对于可见的ASCII字符永远不会冲突的hashmap

接下来是模板:

对于大多数子字符串问题,给定一个字符串,需要找到一个满足某些条件的子字符串,通用的方法是使用一个hashmap和两个指针(begin和end,此指针非彼指针)。

int findSubstring(string s){
        vector<int> map(128,0);
        int counter; // check whether the substring is valid
        int begin=0, end=0; //two pointers, one point to tail and one  head
        int d; //the length of substring

        for() { /* initialize the hash map here */ }

        while(end<s.size()){

            if(map[s[end++]]-- ?){  /* modify counter here */ }

            while(/* counter condition */){ 

                 /* update d here if finding minimum*/

                //increase begin to make it invalid/valid again

                if(map[s[begin++]]++ ?){ /*modify counter here*/ }
            }  

            /* update d here if finding maximum*/
        }
        return d;
  }
时间: 2024-08-27 08:25:43

LeetCode最小窗口子字符串以及求解子字符串模板的相关文章

在父字符串中查找子字符串

在父字符串中查找子字符串(指针控制,也可选择标控制) #pragma once #include<iostream> #include<assert.h> using namespace std; char* StrStr(char* source, char* dest) { assert(source&&dest); if (strlen(source) < strlen(dest)) return NULL; char* newSrc = NULL; c

python判断字符串是否包含子字符串

python的string对象没有contains方法,不可以使用string.contains的方法判断是否包含子字符串,但是python有更简单的方法来替换contains函数 python的string对象没有contains方法,不可以使用string.contains的方法判断是否包含子字符串,但是python有更简单的方法来替换contains函数 python的string对象没有contains方法,不可以使用string.contains的方法判断是否包含子字符串,但是pyth

在一个字符串中提取子字符串

一.提取字符串函数int substr(char dst[], char src[], int start, int len): 分析: 源字符串src[]用来提供字符串: 目的字符串dst[]用来接收子字符串: 从src[]的起始位置向后偏移,从start的位置开始最多复制len个字符,当src[]中字符数可以从start个字符开始复制len个字符,那么可以复制len个字符:当从start开始到字符串结束,即遇到'\0'时,小于len个字符,那么只需复制从start开始到字符串结束的字符串.

SQL计算字符串里的子字符串出现个数

在某个页面,需要显示每条记录中有几个图片文件.图片文件名列表存储在mysql表里的photo_files字段,文件名之间用一个空格分开.类似'images\rpt201503121.jpg images\rpt201503122.jpg images\rpt201503123.jpg'这样. mysql的sql语句并不支持正则表达式函数(或者说极其有限),因此最容易想到的是用sql取出来后用PHP的explode函数放到数组里,计算数组元素个数就知道图片文件个数了.但有没有更简单的办法呢? 我的

求两个字符串最大的子字符串C#

此代码由Java改写而来,字符串支持中文格式的. string str1 = "中国ab-15"; string str2 = "中国ab-23"; byte[] char1 = Encoding.UTF8.GetBytes(str1); byte[] char2 = Encoding.UTF8.GetBytes(str2); int len1 = char1.Length; int len2 = char2.Length; string maxchar = &qu

C# 截取两个字符串中间的子字符串

/// <summary> /// 截取中间字符 /// </summary> /// <param name="text">全字符串</param> /// <param name="start">开始字符串 </param> /// <param name="end">结束字符串 </param> /// <returns></r

从字符串中提取子字符串

#include <assert.h> int substr(char dst[], char src[], int start, int len) {  int srcLen = strlen(src);  int left = 0;  assert(dst);  assert(src);  if (srcLen < start)  {   return -1;  }  while (start--)    {   src++;             //指针向后偏移start  }

寻找子字符串——上

第十一章的习题7,刚开始觉得简单,可是实际思考时发现要考虑很多东西,然后脑子就一片混沌了,然后问题一拖一个月,然而时间并没有帮我解决掉问题,问题还是要自己去努力接触才能发展的呀. 有参考答案,上网也找到了答案,昨天验证了下,是对的.自己就是眼高手低,还犟,想凭借自己的"智慧"想出来(别人的我看了觉得费劲,而且很难理解他的思想,他到底是怎么想到的呢).不过不能自负,遇到问题想不出来很正常,就该学习自己想不到的思路,改变自己的思维方式.应该向前人学习,可以先读懂,理解一点是一点,接触多了自

字符串内子字符串的逆序算法

源于一道ACM的题目,要求将字符串中的子字符串逆序输出,最初的想法就是利用strtok按照空格进行分割字符,再实现以下单个字符串的逆序,再通过strcat进行字符串的拼接,感觉这个想法不错,利用库函数搞搞,但是不知道哪里出错,strcat出来的字符串输出的时候会出现多个换行,非常难受,感觉一个简单的问题,代码太多,所以睡觉的时候就在想,我应该考虑自己写一个算法来实现这个需求,刚好最近在看算法方面的书,那就尝试下吧. 基本思想,从前往后扫描字符串,遇到空格停止,字符串第一个字符start位置,扫描