相似点,一般都是设置两个指针start和end在string的初始位置。
使用和ASCII相同大小的hash来记录每个字母是否出现过,或者出现的次数(或位置)。
end指针一直向前走,直到不满足条件,判断当前[start, end]区间是否符合,然后start指针向前走直到满足条件为止。
然后再前移end指针,重复以上操作。
相关问题:
1. Minimum Window Substring (http://blog.csdn.net/starmsg/article/details/27561027)
需要记录
- int needFind[256] = {0};
- int hasFound[256] = {0};
以及当前区间的字符总数
2. Longest Substring with Two Unique Charachters (http://blog.csdn.net/starmsg/article/details/40081849)
需要记录[start, end]中每个字符出现的次数,以及当前区间的unique字符数量。
#include <iostream>
#include <climits>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
string longest(string str)
{
int longest = 0;
int longest_start = -1;
int occurance[256];
int count = 0;
memset(occurance, 0, sizeof(occurance));
int len = str.size();
int start = 0;
for(size_t i = 0; i<len; i++)
{
occurance[str[i]]++;
if(occurance[str[i]] == 1)
count++;
if(count == 3)
{
cout << i << "start" << endl;
if(i-start > longest)
{
longest = i-start;
longest_start = start;
cout << i << " longest " << longest << endl;
}
while(count == 3)
{
occurance[str[start]]--;
if(occurance[str[start]] == 0)
count--;
start++;
}
}
}
if(len - start > longest)
{
longest = len-start;
longest_start = start;
}
return str.substr(longest_start, longest);
}
int main()
{
cout << longest("aabadefghaabbaa") << endl;
return 0;
}
3. Longest Substring Without Repeating Characters (http://blog.csdn.net/starmsg/article/details/21412261)
需要记录每个字符最后一次出现的位置。
4 Longest Substring that has All Consecutive Characters.
to be completed
5. Minimum Window Substring with at Least N characters
int minsubstr(string &str, int n)
{
const int nn = str.size();
int map[256];
memset(map, 0, sizeof(map));
int unique = 0;
int start = 0;
int minlength = INT_MAX;
int minstart = -1;
for(int i=0; i<nn; i++)
{
map[str[i]]++;
if(map[str[i]] == 1)
{
unique++;
if(unique == n)
{
while(map[str[start]] > 1 && start < i)
{
map[str[start]]--;
start++;
}
if(i-start+1 < minlength)
{
minlength = i-start+1;
minstart = start;
}
if(start < i)
{
map[str[start]]--;
if(map[str[start]] == 0)
unique--;
start++;
}
}
}
}
if(minlength != INT_MAX)
{
cout << minstart << "\t" << minlength << endl;
cout << str.substr(minstart, minlength) << endl;
}
else
cout << "no valid substring found" << endl;
return 0;
}