// 面试题48:最长不含重复字符的子字符串
// 题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子
// 字符串的长度。假设字符串中只包含从'a'到'z'的字符。
// 方法一:蛮力法
static uint32_t max_len_no_rep(const std::string& str)
{
uint32_t max_len = 0;
std::vector<int> cout(26);
for(uint32_t start = 0; start < str.length(); ++start)
{
for(uint32_t end = start; end < str.length(); ++end)
{
uint32_t len = end - start + 1;
if(len < max_len)
{
continue;
}
if(!_has_rep(str, start, end, cout))
{
max_len = len;
}
else
{
break;
}
}
}
return max_len;
}
static bool _has_rep(const std::string& str, uint32_t start, uint32_t end, std::vector<int>& cout)
{
cout.assign(cout.size(), -1);
for(uint32_t i = start; i < end; ++i)
{
uint32_t index = str[i] - 'a';
if(cout[index] >= 0)
{
return true;
}
cout[index]++;
}
return false;
}
// 方法一:动态规划
static uint32_t max_len_no_rep2(const std::string& str)
{
uint32_t cur_len = 0;
uint32_t max_len = 0;
std::vector<int> cout(26, -1);
for(uint32_t i = 0; i < str.length(); ++i)
{
int prevIndex = cout[str[i] - 'a'];
if(prevIndex < 0 || i - prevIndex > cur_len)
{
++cur_len;
}
else
{
if(cur_len > max_len)
{
max_len = cur_len;
}
cur_len = i - prevIndex;
}
cout[str[i] - 'a'] = i;
}
if(cur_len > max_len)
{
max_len = cur_len;
}
return max_len;
}