(分类讨论, 情景模拟) lintcode 640. One Edit Distance, leetcode 388,intcode 645. 13. 12. 659. 660

找特殊情况,分类讨论:三种情况

1)两个字符串的长度之差 大于1 直接返回false;

2)长度之差等于1, 判断长的字符串删掉不一样的字符,剩余的字符串是否相同;

3)长度之差等于0,判断不相同的字符个数,若超过一个返回false。

class Solution {
public:
    /**
     * @param s: a string
     * @param t: a string
     * @return: true if they are both one edit distance apart or false
     */
    bool isOneEditDistance(string &s, string &t) {
        // write your code here
        if(s.size() > t.size())
            swap(s, t);   //保证t比s长
        int diff = t.size() - s.size();
        if(diff > 1)
            return false;
        if(diff == 1){
            for(int i=0; i<s.size(); i++){
                if(t[i] != s[i])
                    return (s.substr(i) == t.substr(i+1));   //t去掉索引为i的字符之后剩余的子串和s是否相同
            }
            return true;
        }
        if(diff == 0){
            int cnt = 0;
            for(int i=0; i<s.size(); i++){
                if(s[i] != t[i])
                    cnt ++;
            }
            return (cnt==1);
        }
    }
};

题意:API :int read4(char *buf) 每次读4个字符,想要实现read函数每次能读入任意字符。

ptr 是读入字符串的指针,bufferPtr是指向buffer队列的头指针,bufferCnt 是指向buffer队列的尾指针。

// Forward declaration of the read4 API.
int read4(char *buf);  //return the actual number of characters read

class Solution {
public:
    /**
     * @param buf destination buffer
     * @param n maximum number of characters to read
     * @return the number of characters read
     */
    char buffer[4];
    int bufferPtr = 0, bufferCnt = 0;  //队列的头指针和尾指针
    int read(char *buf, int n) {
        // Write your code here

        int ptr = 0;
        while(ptr < n){
            if(bufferPtr == bufferCnt){
                //队列为空,进队
                bufferCnt = read4(buffer);
                bufferPtr = 0;
            }
            if(bufferCnt == 0)  //没有数据读入就退出
                break;
            while(ptr < n && bufferPtr < bufferCnt){
                buf[ptr] = buffer[bufferPtr];
                ptr++;
                bufferPtr++;
            }
        }
        return ptr;
    }
};

class Solution {
public:
    /*
     * @param strs: a list of strings
     * @return: encodes a list of strings to a single string.
     */
    string encode(vector<string> &strs) {
        // write your code here
        string ans;
        for(int i=0; i<strs.size(); i++){
            string s = strs[i];
            for(int j = 0; j<s.size(); j++){
                if(s[j] == ‘:‘)
                    ans += "::";   //加一个转义符,把所有的:变为::
                else
                    ans += s[j];
            }
            ans += ":;";    //一个字符串结束后加上分隔符
        }
        return ans;
    }

    /*
     * @param str: A string
     * @return: dcodes a single string to a list of strings
     */
    vector<string> decode(string &str) {
        // write your code here
        vector<string> ans;
        string item;
        int i = 0;
        while(i<str.size()){
            if(str[i] == ‘:‘){
                if(str[i+1] == ‘;‘){
                    // ; 为分隔符
                    ans.push_back(item);
                    item = "";
                    i += 2;
                }
                else{
                    // :为转义符
                    item += str[i+1];
                    i += 2;
                }
            }
            else{
                item += str[i];
                i++;
            }
        }
        return ans;
    }
};

leetcode 388 & lintcode 643

class Solution {
public:

    vector<string> split(string& str, char c){
        char *cstr, *p;
        vector<string> ret;
        cstr = new char[str.size() + 1];
        strcpy(cstr, str.c_str());  //将str拷贝给cstr
        p = strtok(cstr, &c); //将cstr指向的字符数组以c来分割
        while(p!=NULL){
            ret.push_back(p);
            p = strtok(NULL, &c);
        }
        return ret;
    }

    int lengthLongestPath(string input) {
        int ans = 0;
        vector<string> lines = split(input, ‘\n‘);  //用\n来分隔字符串
        map<int, int> level_size;
        level_size[-1] = 0;  // 初始化在第0层

        for(int i=0; i<lines.size(); i++){
            string line = lines[i];
            int level = line.find_last_of(‘\t‘) + 1;
            // 查找字符串中最后一个出现\t。有匹配,则返回匹配位置;否则返回-1.
            int len = (line.substr(level)).size();  //第level层字符串的长度

            if(line.find(‘.‘) != string::npos){   //if(s.find(‘.‘) != -1)
                //找到. 说明是文件
                ans = max(ans, level_size[level - 1] + len);
            }
            else{
                //每一行要加/ 故+1
                level_size[level] = level_size[level - 1] + len + 1;  //前缀和优化
            }
        }
        return ans;
    }
};

题意:party上有n个人,从0到n编号。存在一个名人,其余的n-1个人都认识他,但是他不认识这n-1个人。现在你要用最少的次数找到谁是这个名人。

要求在O(n)的时间内写出来。

思路:有大量的冗余。

若对1做名人检验:2,3,4认识1;而5 不认识1。

说明 1 不是名人,且 2,3,4也不会是名人。

即两个人中,总有一个人被去掉:若1和2 ,2认识1 说明2不是名人;若1和3,3不认识1 说明1不是名人。

// Forward declaration of the knows API.
bool knows(int a, int b);  //return whether A knows B
//if true, A is not celebrity
//if false, B is not celebrity
class Solution {
public:
    /**
     * @param n a party with n people
     * @return the celebrity‘s label or -1
     */
    int findCelebrity(int n) {
        // Write your code here
        int ans = 0;
        for(int i=1; i<n; i++){
            if(knows(ans, i))
                //第0个人认识第i个人说明第0个人不是celebri
                ans = i;  //每次去掉一个人
                //最终得到一个人
        }

        //对上面最后剩下的人做一次名人检验
        for(int i=0; i<n; i++){
            if(ans!=i && knows(ans, i))
                return -1;
            if(ans != i && !knows(i, ans))
                return -1;
        }
        return ans;
    }
};

class Solution {
public:
    int romanToInt(string s) {
        unordered_map<char, int> mp = {{‘I‘,1}, {‘V‘, 5},  {‘X‘, 10}, {‘L‘, 50},  {‘C‘, 100}, {‘D‘, 500}, {‘M‘, 1000}};
        int r = mp[s[0]];
        for(int i=1; i<s.size(); i++){
            r += mp[s[i]];
            if(mp[s[i-1]] < mp[s[i]])
                r = r - 2*mp[s[i-1]];
        }
        return r;
    }
};
class Solution {
public:
    int romanToInt(string s) {
        unordered_map<string, int> mp = {{"I",1}, {"V", 5},  {"X", 10}, {"L", 50},  {"C", 100}, {"D", 500}, {"M", 1000}};
        int r = mp[s.substr(0, 1)];
        for(int i=1; i<s.size(); i++){
            r += mp[s.substr(i, 1)];
            if(mp[s.substr(i-1, 1)] < mp[s.substr(i, 1)])
                r -= 2*mp[s.substr(i-1, 1)];
        }
        return r;
    }
};

class Solution {
public:
    string intToRoman(int num) {
        vector<int> value = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5,4,1};
        vector<string> roman = {"M", "CM", "D","CD","C","XC","L","XL","X","IX","V","IV",
"I"};
        string str;
        int i = 0;
        while(i<value.size()){
            if(num >= value[i]){
                num -= value[i];
                str += roman[i];
            }
            else
                i++;
        }
        return str;
    }
};

原文地址:https://www.cnblogs.com/Bella2017/p/11443578.html

时间: 2024-10-15 16:20:19

(分类讨论, 情景模拟) lintcode 640. One Edit Distance, leetcode 388,intcode 645. 13. 12. 659. 660的相关文章

Edit Distance leetcode java

题目: Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: a) Insert a character b) Delete a character c) R

Edit Distance -- LeetCode

原标题链接: http://oj.leetcode.com/problems/edit-distance/ 这道题求一个字符串编辑成为还有一个字符串的最少操作数,操作包含加入,删除或者替换一个字符.这道题难度是比較大的,用常规思路出来的方法一般都是brute force,并且还不一定正确. 这事实上是一道二维动态规划的题目.模型上确实不easy看出来.以下我们来说说递推式. 我们维护的变量res[i][j]表示的是word1的前i个字符和word2的前j个字符编辑的最少操作数是多少.如果我们拥有

【Lintcode】119.Edit Distance

题目: Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: Insert a character Delete a character Replace a

Edit Distance @Leetcode -- Python

http://oj.leetcode.com/problems/edit-distance/ class Solution: # @return an integer def minDistance(self, word1, word2): len1 = len(word1) len2 = len(word2) dp = [[0 for j in xrange(len2+1)] for i in xrange(len1 +1)] for i in xrange(len1+1): dp[i][0]

【线段树】【分类讨论】水果姐逛水果街Ⅰ

3304 水果姐逛水果街Ⅰ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价. 就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第x家店出发到第y家店

dp+分类讨论 Gym 101128E

题目链接:http://codeforces.com/gym/101128 感觉这个人写的不错的(我只看了题目大意):http://blog.csdn.net/v5zsq/article/details/61428924 Description n个小木条,一段前面有一个小箭头,给出第一个小木条的非箭头端端点横坐标以及每个小木条箭头端的坐标,现在要从下往上把这n'个木条按顺序叠放好,要求相邻两个小木条必须有一个共同端点且有交叠部分,问小木条有多少种放法 Input 第一行一整数n表示木条数量,之

BZOJ 1067 降雨量(RMQ+有毒的分类讨论)

1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4399  Solved: 1182 [Submit][Status][Discuss] Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890, 则可以说

cf 251 B Playing with Permutations 暴力 分类讨论

题链;http://codeforces.com/problemset/problem/251/B B. Playing with Permutations time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Little Petya likes permutations a lot. Recently his mom has p

BZOJ 1099([POI2007]树Drz-9次线段树&amp;分类讨论+线段树与插入顺序维护2个参数)

1099: [POI2007]树Drz Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 142  Solved: 55 [Submit][Status] Description CDQZ是一个偏远的小学校,FGD在学校里中了一排树.他却不喜欢这些树的顺序,因为他们高高矮矮显得那么参差不齐. FGD定义这些树的不整齐程度为相邻两树的高度差的和.设树高分别为h1,h2,h3,-,hn.那么不整齐程度定义为:|h1-h2|+|h2-h3|+--+|hn