zoukankan      html  css  js  c++  java
  • [LeetCode] Substring with Concatenation of All Words

    方法一:暴力搜索

    针对S中每个字符开始搜索一次长度为wordLen*len的字符串,是否包含L中的所有单词。
    这个很好统计,Map就可以直接搞定。思路很好想,同时也很费时。

    超时

    class Solution {
        map<string, int> m_map;
        public:
            void initMap(vector<string> &L)
            {
                m_map.clear();
                for(size_t i = 0; i <L.size() ; i++)
                {
                    if(m_map.find(L[i]) == m_map.end())
                        m_map[L[i]] = 1;
                    else
                        m_map [L[i]]++;
                }
            }
    
            void printMap()
            {
                map<string,int>::iterator it;
                for(it = m_map.begin(); it != m_map.end(); it++)
                {
                    cout << it->first << "	-->	" << it->second << endl;
                }
                cout << endl;
            }
    
            vector<int> findSubstring(string S, vector<string> &L)
            {
                vector<int> result;
                if(L.size() == 0)
                    return result;
    
                size_t wordLen = L[0].size();
                size_t wordNum = L.size();
                size_t wordsLen = wordLen * wordNum;
    
                if(S.size() < wordsLen)
                    return result;
    
                //cout << "wordLen 	" << wordLen << endl;
                //cout << "wordNum 	" << wordNum<< endl;
                //cout << "wordsLen	" << wordsLen << endl;
    
                initMap(L);
                //printMap();
    
                for(size_t i = 0; i <= S.size() - wordsLen; i++)
                {
                    size_t j = i;
                    for( /**/; j < (i + wordsLen); j += wordLen)
                    {
                        //cout << "j	" << j << endl;
                        //printMap();
                        string tmp = S.substr(j, wordLen);
                        if(m_map.find(tmp) != m_map.end() && m_map[tmp] > 0)
                        {
                            m_map[tmp]--;
                        }
                        else
                        {
                            break;
                        }
                    }
                    //cout << "==j	" << j << endl;
                    if(j >= (i+wordsLen))
                    {
                        result.push_back(i);
                    }
                    initMap(L);
                }
                return result;
    
            }
    };

     方法二:

      把上面的map直接改成unordered_map就AC了,我去,为此直接查找了一番map和unordered_map的区别

      map 是基于红黑树,查找时间为logN, 而unordered_map是基于hash的,查找时间理论为O(1)

      连接 http://zrj.me/archives/1248 解析unordered_map

      https://msdn.microsoft.com/zh-cn/library/bb982522.aspx

    此模板类描述用于控制 std::pair<const Key, Ty> 类型的变长元素序列的对象。 序列由哈希函数弱排序,哈希函数将此序列分区到称为存储桶的有序序列集中。 在每个存储桶中,比较函数将确定任一元素对是否具有等效顺序。 每个元素存储两个对象,包括一个排序键和一个值。 序列以允许查找、插入和移除任意元素的方式表示,并包含与序列中的元素数量无关的多个操作(常量时间),至少在所有存储桶长度大致相等时如此。 在最坏情况下,当所有元素位于一个存储桶中时,操作数量与序列中的元素数量成比例(线性时间)。 此外,插入元素不会使迭代器失效,移除元素仅会使指向已移除元素的迭代器失效。

    template<class Key,
        class Ty,
        class Hash = std::hash<Key>,
        class Pred = std::equal_to<Key>,
        class Alloc = std::allocator<std::pair<const Key, Ty> > >
        class unordered_map;

     另外,unordered_map是C++11引入的,要想使用unordered_map, 需要加上 g++ main.cpp  -std=c++11 选项。

  • 相关阅读:
    MVC ORM 架构
    Kubernetes 第八章 Pod 控制器
    Kubernetes 第七章 Configure Liveness and Readiness Probes
    Kubernetes 第六章 pod 资源对象
    Kubernetes 第五章 YAML
    Kubernetes 核心组件
    Kubernetes 架构原理
    Kubernetes 第四章 kubectl
    Kubernetes 第三章 kubeadm
    yum 配置及yum 源配置
  • 原文地址:https://www.cnblogs.com/diegodu/p/4282041.html
Copyright © 2011-2022 走看看