一:leetcode 204 Count Primes
题目:
Description:
Count the number of prime numbers less than a non-negative number, n
分析:此题的算法源码可以参看这里,http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes代码:
class Solution { public: int countPrimes(int n) { // 求小于一个数n的素数个数 方法思想 bool *isPrimes = new bool[n]; memset(isPrimes, 0, sizeof(bool)*(n)); int ans = 0; for(int i = 2; i < n; i++){ while(i < n && isPrimes[i]) i++; if(i >= n) break; ans ++; for(int j = 2; j <= (n-1)/i; j++) isPrimes[j*i] = 1; } delete []isPrimes; return ans; } };
题目:
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA.
Write a function to find all the 10-letter-long sequences (substrings) that occur more than once in a DNA molecule.
For example,
Given s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT", Return: ["AAAAACCCCC", "CCCCCAAAAA"].分析:此题可以看做是判重,可以采用hash_table或者trie树,但是此题对内存要求比较严格,用map<string, int>则会memory limit,此外我这里写的trie树也会memory limit,
因此使用hashtable的话就必须找到hash函数将string转换为int,一是可以自己编写hash函数或者是用c++11自带的hash<string>。
代码:
一:hashtable
class Solution { public: vector<string> findRepeatedDnaSequences(string s) { vector<string> result; hash<string> hash_func; // 将string转换为int的hash函数 for(int i = 0; i < s.size(); i++){ string str = s.substr(i, 10); if(str.size() < 10) break; int x = hash_func(str); if(hmap.count(x)){ if(hmap[x] == 1)result.push_back(str); hmap[x]++; } else hmap.insert(pair<int, int>(x, 1)); } return result; } private: unordered_map<int, int> hmap; // c++的STL中map/set用string会消耗很多memory };或者用自己写的hash table:
class Solution { public: int strToInt(const string &str){ int result = 0; for(int i = 0; i < 10; i++){ switch(str[i]) { case 'A': result += 0; break; case 'C': result += 1; break; case 'G': result += 2; break; case 'T': result += 3; break; } result = (result << 2); } return result; } vector<string> findRepeatedDnaSequences(string s) { vector<string> result; hash<string> hash_func; // 将string转换为int的hash函数 for(int i = 0; i < s.size(); i++){ string str = s.substr(i, 10); if(str.size() < 10) break; // int x = hash_func(str); int x = strToInt(str); if(hmap.count(x)){ if(hmap[x] == 1)result.push_back(str); hmap[x]++; } else hmap.insert(pair<int, int>(x, 1)); } return result; } private: unordered_map<int, int> hmap; // c++的STL中map/set用string会消耗很多memory };
struct TrieNode{ TrieNode *node[5]; int count; TrieNode():count(1){ for(int i = 0; i < 5; i++){ node[i] = NULL; } } }; class Solution { private: void destroy(TrieNode *p){ if(p != NULL){ for(int i = 0; i < 5; i++) destroy(p->node[i]); delete p; } } public: bool isExist(TrieNode *p, const string &str){ bool flag = true; for(int i = 0; i < str.size(); i++){ int index = (str[i]-'A') % 5; if(p->node[index] == NULL){ p->node[index] = new TrieNode(); flag = false; } p = p->node[index]; } if(flag){ if(p->count != 1) flag = false; p->count ++; } return flag; } vector<string> findRepeatedDnaSequences(string s) { vector<string> result; TrieNode *root = new TrieNode(); for(int i = 0; i < s.size(); i++){ string str = s.substr(i, 10); if(str.size() < 10) break; if(isExist(root, str)) result.push_back(str); } destroy(root); return result; } };三:leetcode 205 Isomorphic Strings
题目:
Given two strings s and t, determine if they are isomorphic.
Two strings are isomorphic if the characters in s can be replaced to get t.
All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.
For example,
Given "egg"
, "add"
, return true.
Given "foo"
, "bar"
, return false.
Given "paper"
, "title"
, return true.
Note:
You may assume both s and t have the same length.
class Solution { public: bool isIsomorphic(string s, string t) { if(s == t) return true; int m = s.size(), n = t.size(); if(m != n) return false; for(int i = 0; i < m; i++){ if(lmap.count(s[i]) && lmap[s[i]] != t[i]) return false; else lmap.insert(pair<char, char>(s[i], t[i])); if(rmap.count(t[i]) && rmap[t[i]] != s[i]) return false; else rmap.insert(pair<char, char>(t[i], s[i])); } return true; } private: unordered_map<char, char> lmap; // 分别建立了左右两个hash table unordered_map<char, char> rmap; };