题目:
输入一个字符串,找出字符串中最长的不含重复字符的子字符串,计算该子字符串的长度。假设字符串中的字符为“a~z”,例如 arabcacfr ,最长的字符串为 rabc 和 acfr ,长度为 4 。
代码:
int Find_Max_Len(string str)
{
int len = str.length();
if (len < 2)
return len;
vector<int> dp(26, -1);
int index = 0;
int max_len = 0;
for (int i = 0; i < len; ++i)
{
if (index > dp[str[i] - 'a'])
{
max_len = max(i - index + 1, max_len);
}
else
{
index = i;
}
dp[str[i] - 'a'] = i;
}
return max_len;
}
解析:
dp数组值表示字符出现的坐标,例如:dp[2]=2表示c字符在下标为2的地方出现过一次,index表示不重复字符的起始下标。
index小于或等于dp[str[i] - ‘a’],说明index~i之间有字符str[i],则重新调整下标index的值;
index大于dp[str[i] - ‘a’],说明index~i之间还没有出现重复的字符,则需比较最大长度和现在最大长度。