(反向思维) leetcode 836. Rectangle Overlap

 

 

class Solution {
public:
    bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
        
        //不重叠的情况:左;右;上;下 返回false
        //两个矩形的边或角重叠不算重叠
        if(rec1[2] <= rec2[0] || rec1[0] >= rec2[2] || rec1[3] <= rec2[1] || rec1[1] >= rec2[3])
            return false;
        else 
            return true;   
    }
};

 

 

 

 

 

class Solution {
public:
    /**
     * @param word: a non-empty string
     * @param abbr: an abbreviation
     * @return: true if string matches with the given abbr or false
     */
    bool validWordAbbreviation(string &word, string &abbr) {
        // write your code here
        //把某一段替换为这一段的长度称为它的缩写
        //指针怎么指,见到数字怎么办,指针溢出如何处理
        int i = 0, j = 0;
        int n = word.size(), m = abbr.size();
        while(i<n && j<m){
            if(abbr[j] >= '0' && abbr[j] <= '9'){
                if(abbr[j] == '0')
                    return false;   //前导0返回false
                int val = 0;
                while(j<m && abbr[j] >= '0' && abbr[j] <= '9'){
                    val = val*10 + (abbr[j] - '0');
                    j++;
                }
                i = i + val;  //i跳过数字的部分
            }
            else{
                if(word[i] != abbr[j])
                    return false;
                else{
                    i++;
                    j++;
                }
            }
        }
        
        // "aa" "a2"
        if(i == n && j == m)
            return true;
        else return false;
    }
};

 

follow up :

 

 

 

 

 

 思路:

1)直接模拟;

2)  求出abbr 有重复就增加prefix, 继续求 abbr

用hash来判断重复。

class Solution {
public:
    /**
     * @param dict: an array of n distinct non-empty strings
     * @return: an array of minimal possible abbreviations for every word
     */
    string getAbbr(string s, int p){  //p为前缀长度
        if(p >= s.size()-2)  //s的长度最小,需要大于等于 p+2(前缀的长度p + 数字的长度 1 + 最后一个字符的长度 1)
            return s;  //规则3
        string ans;
        //to_string : 将整型转换为string型,s.back()得到s的最后一个字符
        ans = s.substr(0, p) + to_string(s.size()-1-p) + s.back();
        return ans;
    }
    
    vector<string> wordsAbbreviation(vector<string> &dict) {
        // write your code here
        int len = dict.size();
        vector<string> ans(len);
        vector<int> prefix(len);
        unordered_map<string, int> count;
        
        for(int i=0; i<len; i++){
            prefix[i] = 1;  //前缀长度初始为1
            ans[i] = getAbbr(dict[i], 1); //得到每个字符串的缩写
            count[ans[i]] ++;
        }
        
        while(true){
            bool unique = true;
            for(int i=0; i<len; i++){
                if(count[ans[i]] > 1){
                    prefix[i] ++;
                    ans[i] = getAbbr(dict[i], prefix[i]);
                    count[ans[i]] ++;
                    unique = false;
                }  
            } //while循环直到unique为true退出
            if(unique)
                break;
        }
        return ans;
    }
};

 

posted @ 2019-08-31 15:15  爱学英语的程序媛  阅读(144)  评论(0编辑  收藏  举报