1、题目说明
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入 | 输出 | 说明 |
---|---|---|
“abcade” | 5 | 无重复字符最长子串为“bcade”,所以输出为5 |
“aaaaa” | 1 | 无重复字符最长子串为“a“,所以输出为1 |
”qwwer“ | 3 | 无重复字符最长子串为”wer“,所以输出为3 |
2、分析
根据示例我们可以看出,题目需要我们找出字符串中无重复字符且连续的一段最长子串的长度。
思路:①设置两个下标move_index和start_index,起始位置都为0;
②move_index++,循环比较move_index下标及其之前子字符串中是否存在相同字符;
③若不存在,那么start_index就始终为0;
④若存在,那么start_index就指向相同字符的下一个位置;
示例:string s = “abcadf”;其中表示move_index的位置,表示start_index的位置。
次数\下标 | 0 | 1 | 2 | 3 | 4 | 5 | 长度 (下标相减+1) |
---|---|---|---|---|---|---|---|
第一次 | a | 0-0+1 = 1 | |||||
第二次 | a | b | 1-0+1 = 2 | ||||
第三次 | a | b | c | 2-0+1 = 3 | |||
第四次 | b | c | a | 3-1+1 = 3 | |||
第五次 | b | c | a | d | 4-1+1 = 4 | ||
第六次 | b | c | a | d | f | 5-1+1 = 5 |
3、代码
int ReturnMaxLengthStr(string s)
{
int start_index = 0;
int move_index;
int index;
int max_length = 0; //最大长度
for (move_index = 0; move_index < s.size(); ++move_index) //循环整个字符串
{
//循环[start_index,move_index)之间的子字符串
for (index = start_index; index < move_index; ++index)
{
//判断是否存在字符相等的情况
if(s[index] == s[move_index])
{
//若相等,则将start_move指向相同字符的下一个位置,并且break跳出本次循环
start_index = index + 1;
break;
}
}
//比较此次子字符串的长度和max_length
if (move_index - start_index + 1 > max_length)
{
max_length = move_index - start_index + 1;
}
}
return max_length;
}
小弟能力有限,若有更好的方法,欢迎大家交流讨论。