zoukankan      html  css  js  c++  java
  • (哈希表,滑动窗口,栈) lintcode 646

    class Solution {
    public:
        /**
         * @param s: a string
         * @return: it's index
         */
        int firstUniqChar(string &s) {
            // write your code here
            vector<int> cnt(256, 0);
            for(int i=0; i<s.size(); i++)
                cnt[s[i]] ++;
            
            for(int i=0; i<s.size(); i++){
                if(cnt[s[i]] == 1)
                    return i;
            }
            return -1;
        }
    };

     

     A 和 B 互为 anagram 的充分必要条件是 : A中每个字符出现的次数 = B中每个字符出现的次数

    class Solution {
    public:
        /**
         * @param s: a string
         * @param p: a string
         * @return: a list of index
         */
         //sliding window + hash
        vector<int> findAnagrams(string &s, string &p) {
            // write your code here
            // 返回所有同构串的首地址
            vector<int> ans;
            vector<int> cnt(256, 0), cnp(256, 0);
            
            if(s.size() < p.size())
                return ans;
                
            for(int i=0; i<p.size(); i++){
                //统计每个字符出现的次数
                cnt[s[i]] ++;
                cnp[p[i]] ++;
            }
            
            if(cnt == cnp)
                ans.push_back(0);
                
            //sliding window
            for(int i=p.size(); i<s.size(); i++){
                cnt[s[i]]++;  //增加右边
                cnt[s[i-p.size()]] --;   //减少左边
                if(cnt == cnp)
                    ans.push_back(i-p.size()+1);
            }
            
            return ans;
        }
    };

     

     

    class ValidWordAbbr {
    public:
        /*
        * @param dictionary: a list of words
        */
        unordered_map<string, int> abbr;
        unordered_map<string, int> dict;
        
        ValidWordAbbr(vector<string> dictionary) {
            // do intialization if necessary
            for(int i=0; i<dictionary.size(); i++){
                string w = dictionary[i];
                dict[w]++;   //统计字符串的个数
                
                //abbr dictionary 统计每个字符串缩写的个数
                if(w.size() <= 2)
                    abbr[w]++;   
                else
                    abbr[w.front()+to_string(w.size()-2)+w.back()]++;
            }
        }
    
        /*
         * @param word: a string
         * @return: true if its abbreviation is unique or false
         */
        bool isUnique(string &word) {
            // write your code here
            if(word.size()<=2)
                return abbr[word]==dict[word];
            else
                return abbr[word.front()+to_string(word.size()-2)+word.back()]==dict[word];
        }
    };
    
    /**
     * Your ValidWordAbbr object will be instantiated and called as such:
     * ValidWordAbbr obj = new ValidWordAbbr(dictionary);
     * bool param = obj.isUnique(word);
     */

     要求O(n)的时间复杂度。

    class Solution {
    public:
        int longestConsecutive(vector<int>& nums) {
            unordered_set<int> map(nums.begin(), nums.end());
            int ans = 0;
            for(int i=0; i<nums.size(); i++){
                if(map.find(nums[i]) != map.end()){
                    map.erase(nums[i]);
                    int pre = nums[i]-1;
                    int next = nums[i]+1;
                    while(map.find(pre) != map.end()){
                        map.erase(pre);
                        pre--;
                    }
                    while(map.find(next) != map.end()){
                        map.erase(next);
                        next++;
                    }
                    ans = max(ans, next-pre-1);
                }
            }
            return ans;
        }
    };

     

     解法:栈

     首先在栈中加入空串,这样可以将b和c情况合为一种情况,如:()) 这样会判断为 ‘ ’ 和 ) 不匹配,返回false

    class Solution {
    public:
        /**
         * @param s: A string
         * @return: whether the string is a valid parentheses
         */
        bool isValidParentheses(string &s) {
            // write your code here
            //
            vector<char> stack;
            stack.push_back(' ');  //压入空字符,作为dummy 0
            for(char w : s){
                if(w == '(' || w == '[' || w == '{')
                    stack.push_back(w);
                else if(w == ')'){
                    if(stack.back() != '(')
                        return false;
                    else
                        stack.pop_back();
                }
                else if(w == ']'){
                    if(stack.back() !='[')
                        return false;
                    else
                        stack.pop_back();
                }
                else if(w == '}'){
                    if(stack.back() !='{')
                        return false;
                    else
                        stack.pop_back();
                }
            }
            if(stack.back() != ' ')
                return false;
            return true;
        }
    };

     

     

    class LoadBalancer {
    public:
        int p;
        vector<int> array;
        unordered_map<int, int> mp;
        
        LoadBalancer() {
            // do intialization if necessary
            p = 0;
            srand((unsigned)time(NULL));
        }
    
        /*
         * @param server_id: add a new server to the cluster
         * @return: nothing
         */
        void add(int server_id) {
            // write your code here
            if(mp.find(server_id) == mp.end()){
                //mp中没找到对应元素,插入
                array.push_back(server_id);
                mp[server_id] = p;
                p++;
            }
        }
    
        /*
         * @param server_id: server_id remove a bad server from the cluster
         * @return: nothing
         */
        void remove(int server_id) {
            // write your code here
            if(mp.find(server_id) != mp.end()){
                mp[array[p-1]] = mp[server_id];  //将mp里array最后一个元素,对应的位置更新为mp中key为server_id对应的位置
                array[mp[server_id]] = array[p-1];   //将array中server_id的位置用array的最后一个元素替换
                array.pop_back();    //删掉array的最后一个元素
                mp.erase(server_id);  //删掉mp中的 server_id
                p--;
            }
        }
    
        /*
         * @return: pick a server in the cluster randomly with equal probability
         */
        int pick() {
            // write your code here
            return array[rand()%p];
        }
    };
  • 相关阅读:
    【Javascript】javascript学习 三十二 JavaScript 表单验证
    【Javascript】javascript学习 三十四 JavaScript 图像地图
    【Javascript】javascript学习 三十三 JavaScript 动画
    【Javascript】javascript学习 三十六 创建你自己的 JavaScript 对象
    【Javascript】javascript学习 三十七 JavaScript 总结
    【HTML】HTML 教程(系列教程转载)
    【XML】XML概述(连载)
    【Javascript】javascript学习 三十五 JavaScript 计时
    【XML】XML教程
    判断各版本IE的HTML和CSS语句
  • 原文地址:https://www.cnblogs.com/Bella2017/p/11448405.html
Copyright © 2011-2022 走看看