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

简介:

题目

一个字符串中含有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

目录
相关文章
|
2月前
|
存储
力扣面试经典题之数组/字符串
力扣面试经典题之数组/字符串
24 0
|
4月前
面试题 08.08:有重复字符串的排列组合
面试题 08.08:有重复字符串的排列组合
28 0
|
15天前
|
存储 Go 开发者
Golang深入浅出之-Go语言字符串操作:常见函数与面试示例
【4月更文挑战第20天】Go语言字符串是不可变的字节序列,采用UTF-8编码。本文介绍了字符串基础,如拼接(`+`或`fmt.Sprintf()`)、长度与索引、切片、查找与替换(`strings`包)以及转换与修剪。常见问题包括字符串不可变性、UTF-8编码处理、切片与容量以及查找与替换的边界条件。通过理解和实践这些函数及注意事项,能提升Go语言编程能力。
25 0
|
2月前
|
算法 测试技术 索引
力扣面试经典题之数组/字符串(二)
力扣面试经典题之数组/字符串(二)
14 0
|
4月前
|
算法 Java C++
数据结构与算法面试题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。(提示:使用动态规划或者中心扩散)
数据结构与算法面试题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。(提示:使用动态规划或者中心扩散)
44 0
|
4月前
面试题 08.07:无重复字符串的排列组合
面试题 08.07:无重复字符串的排列组合
25 0
|
4月前
面试题 01.09:字符串轮转
面试题 01.09:字符串轮转
25 0
|
4月前
面试题 01.06:字符串压缩
面试题 01.06:字符串压缩
22 0
|
4月前
|
前端开发 JavaScript 索引
【面试题】 JavaScript 字符串截取方法有哪些?
【面试题】 JavaScript 字符串截取方法有哪些?
【LeetCode-每日一题】-面试题46. 把数字翻译成字符串
【LeetCode-每日一题】-面试题46. 把数字翻译成字符串