[经典面试题][搜狗]在一个字符串中寻找包含全部出现字符的最小字串

题目

一个字符串中含有n个字符,其中有m个不同的字符,n>>m,用最少的时间和空间找到包含所有这m个字符的最短的字串,不考虑特殊字符,只考虑字母数字即可。
例如:
abccbaddac, 返回:cbad
aabcadbbbcca,返回:bcad

思路

[算法系列之二十二]包含T全部元素的最小子窗口
本题目相比连接中所说的稍微简单一些,本题目不用考虑重复字符。

代码

    /*---------------------------------------------
    *   日期:2015-02-24
    *   作者:SJF0115
    *   题目: 包含全部出现字符的最小字串
    *   来源:搜狗
    *   博客:
    -----------------------------------------------*/
    #include <iostream>
    #include <climits>
    using namespace std;

    string MinWindow(string S){
        int slen = S.size();
        if(slen <= 0){
            return "";
        }//if
        int minWinStart,minWinEnd;
        int minWinLen = INT_MAX;
        // 统计不同字符个数
        int m = 0;
        int needFind[256] = {0};
        for(int i = 0;i < slen;++i){
            needFind[S[i]] = 1;
        }//for
        for(int i = 0;i < 256;++i){
            if(needFind[i] == 1){
                ++m;
            }//if
        }//for

        int hasFound[256] = {0};
        int val;
        int count = 0;
        for(int start = 0,end = 0;end < slen;++end){
            val = S[end];
            ++hasFound[val];
            if(hasFound[val] <= 1){
                ++count;
            }//if
            // 找到一子串包含全部不同的字符
            if(count == m){
                int startEle = S[start];
                while(hasFound[startEle] > 1){
                    --hasFound[startEle];
                    ++start;
                    startEle = S[start];
                }//while

                int curWinLen = end - start + 1;
                if(minWinLen > curWinLen){
                    minWinLen = curWinLen;
                    minWinStart = start;
                    minWinEnd = end;
                }//if
            }//if
        }//for
        if(count != m){
            return "";
        }//if
        return S.substr(minWinStart,minWinEnd - minWinStart + 1);
    }

    int main() {
        string S("aabcadbbbcca");
        cout<<MinWindow(S)<<endl;
    }

引用:

[算法系列之二十二]包含T全部元素的最小子窗口

相似题目:

[LeetCode]76.Minimum Window Substring

时间: 2024-11-03 07:13:40

[经典面试题][搜狗]在一个字符串中寻找包含全部出现字符的最小字串的相关文章

在字符串中寻找指定的字符,并且返回它的下标,要求用递归实现

问题描述 在字符串中寻找指定的字符,并且返回它的下标,要求用递归实现 在字符串中寻找指定的字符,并且返回它的下标,要求用递归实现,怎么做,C语言 解决方案 #include <stdio.h> int foo(char * s, char f, int acc) { if (s[acc] == '') return -1; if (s[acc] == f) return acc; return foo(s, f, acc + 1); } int main() { char s[] = &quo

判断某个字符在一个字符串中是否存在的js代码

 这篇文章主要介绍了判断某个字符在一个字符串中是否存在的方法,需要的朋友可以参考下  代码如下: $(function(){  var str="sunny,woo";  var sear=new RegExp(',');  if(sear.test(str))  {  alert('Yes');  }  var tag=',';  if(str.indexOf(tag)!=-1)  {  alert('Yes');  }  });     

JS查找字符串中出现次数最多的字符_javascript技巧

在一个字符串中,如 'zhaochucichuzuiduodezifu',我们要找出出现最多的字符.本文章将详细说明方法思路. 先介绍两个string对象中的两个方法:indexOf()和charAt()方法 indexOf()方法介绍 返回某个指定的字符串值在字符串中首次出现的位置 charAt()方法介绍 返回某个指定位置的字符 先做一个小测试,找到字符串'woainixiaoli'中的每一个'i'出现的位置. <script> var arr = 'woainixiaoli'; var

javascript 查找字符串中最后一次出现字符或字符串

在js中要实现查找字符串中最后一次出现字符或字符串我们可以用到lastIndexOf() 方法 string.lastIndexOf(string, num)     string.lastIndexOf(string) lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索 <html>     <script language="JavaScript">     <!--     var myStr

Python检测字符串中是否包含某字符集合中的字符

  这篇文章主要介绍了Python检测字符串中是否包含某字符集合中的字符,需要的朋友可以参考下 目的 检测字符串中是否包含某字符集合中的字符 方法 最简洁的方法如下,清晰,通用,快速,适用于任何序列和容器 代码如下: def containAny(seq,aset): for c in seq: if c in aset: return True return False 第二种适用itertools模块来可以提高一点性能,本质上与前者是同种方法(不过此方法违背了Python的核心观点:简洁,清

php 判断字符串中是否包含html标签

 本篇文章主要是对使用php判断字符串中是否包含html标签的实例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 function judgeHtml($str){  if($str != strip_tags($str)){   echo '有';  }else{   echo '无';  } } judgeHtml('<p>a'); echo '<br />'; judgeHtml('a'); 输出:有        无   

JavaScript实现计算字符串中出现次数最多的字符和出现的次数

 这篇文章主要介绍了JavaScript实现计算字符串中出现次数最多的字符和出现的次数,本文直接给出实现代码,需要的朋友可以参考下     "计算出字符串中出现次数最多的字符是什么,出现了多少次?" 看到这个需求,我想大多数人应该首先想到的是转换成数组,再做处理,当然是可以解决问题的,然后这里提供一个巧妙的算法设计,无需转数组,可以很快解决问题,代码如下:   代码如下: var str = "adadfdfseffserfefsefseeffffftsdg"; v

[华为上机练习题]7.删除字符串中出现次数最少的字符

题目 描述: 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 题目类别: 字符串 难度: 中级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出: 删除字符串中出现次数最少的字符后的字符串. 样例输入: abcdd 样例输出: dd 代码 /*------------------------

《Python Cookbook(第2版)中文版》——1.8 检查字符串中是否包含某字符集合中的字符

1.8 检查字符串中是否包含某字符集合中的字符 任务 检查字符串中是否出现了某字符集合中的字符. 解决方案 最简单的方法如下,兼具清晰.快速.通用(适用于任何序列,不仅仅是字符串,也适用于任何容器,不仅仅是集合): def containsAny(seq, aset): """ 检查序列seq是否含有aset中的项 """ for c in seq: if c in aset: return True return False 也可以使用更高级和