(哈希表,滑动窗口,栈) 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];
    }
};

 

转载于:https://www.cnblogs.com/Bella2017/p/11448405.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值