187 Repeated DNA Sequences
class Solution {
public:
vector<string> findRepeatedDnaSequences(string s) {
//DNA序列是由ACGT四个组成的
//识别重复序列 in 10个字母长度
//不用顺序输出
//HASH表在这里是用中间态保存还是快速查找
//怎么保存 查找什么
//问题1:10个字母长度序列,顺序查找一共有n-10+1种序列可能重复出现在s种
//问题2:怎么判别这个序列重复出现?可以是重叠出现
//一直重复-->按顺序压缩字符串-->双指针
//哈希表用于快速查找
int n = s.size();
if(n < 10)return {};
vector<string> res;
unordered_set<string> dnaSet;
//找出s.substr(pos,10);
//重叠条件s.substr(pos1,10) == s.substr(pos2,10);
//满足重叠条件push进res;
for(int i = 0 ; i < n-10+1 ; i++){
string s1 = s.substr(i,10);
if(dnaSet.find(s1) == dnaSet.end()){//没被存储在哈希表种
for(int j = i+1; j < n-10+1 ; j++){
string s2 = s.substr(j,10);
if(s1 == s2){
res.push_back(s1);
dnaSet.insert(s1);
break;
}
}
}
}
return res;
}
};
提交:超出时间限制----> 1 0 5 10^5 105情况下时间复杂度为 O ( n 2 ) O(n^2) O(n2)就会造成超时
复查思路:限制时间复杂度为o(n)
class Solution {
public:
vector<string> findRepeatedDnaSequences(string s) {
//HASH表在这里是快速查找,防止重复DNA序列存储进res中
//第一次提交导致:时间超时 时间复杂度为O(n^2)
//所以需要将时间压缩到O(logn)或者O(n)--->所以是边遍历边判断
int n = s.size();
if(n < 10)return {};
vector<string> res;
unordered_set<string> dnaSet , stored;
//找出s.substr(pos,10);
//重复条件s.substr(pos1,10) == s.substr(pos2,10);
//直接存到hash表中,在后面的遍历中判断就行
//如何保证输入进res的string独一无二
//满足重复条件push进res;
for(int i = 0 ;i < n-10+1 ;i++ ){
string s1 = s.substr(i,10);
if(dnaSet.find(s1) != dnaSet.end() && stored.find(s1) == stored.end()){
//重复且没有被存入res中的s1
res.push_back(s1);
stored.insert(s1);
}else{
dnaSet.insert(s1);
}
}
return res;
}
};
review 8.4 443 String Compression
class Solution {
public:
int compress(vector<char>& chars) {
//双指针,一个写一个读,原地修改chars
int n = chars.size();
if(n == 1 )return 1;
int write = 0 , read = 0;
while(read < n){
int count = 1;
char ch1 = chars[read];
chars[write++] = ch1;
//数数
for(int i = read+1 ; i<n&&chars[i] == ch1;i++){
count++;
}
//写入长度
if(count != 1){
string str = to_string(count);
for(char ch : str){
chars[write++] = ch;
}
}
//移动指针
read+=count;
}
return write;
}
};