题目
解题思路
这个题是一个比较典型的动态规划问题。解题思路大致如下:
以abcbef这个串为例
用一个数据结构pos记录每个元素曾出现的下标,初始为-1
从s[0]开始,pos[‘a’] == -1,说明a还未出现过,令pos[‘a’] = 0,视为将a”加入当前串”,同时长度++
同理令pos[‘b’] = 1,pos[‘c’] = 2
到s[3]时,pos[‘b’] != -1,说明’b’在前面已经出现过了,此时可得到一个不重复串”abc”,刷新当前的最大长度,然后做如下处理:
将pos[s[0~2]]中相应的值更新(不是全部更新) ,亦即将”ab”“移出当前串”,再次计算时将当前长度减去2;
代码
int lengthOfLongestSubstring(string s) {
vector<int> dict(256, -1);
int maxLen = 0, start = -1;
for (int i = 0; i != s.length(); i++) {
if (dict[s[i]] > start)
start = dict[s[i]];
dict[s[i]] = i;
maxLen = max(maxLen, i - start);
}
return maxLen;
}
这里补充几点:
1. 对于这行语句
vector<int> dict(256, -1) //创建一个256个值的一维动态数组,且初始化值全部为-1
为什么要取256呢?
因为ASCII码表里的字符总共256个,前128个为常用的字符如运算符,字母 ,数字等 键盘上可以显示的后 128个为 特殊字符是键盘上找不到的字符。
2. 对于这个问题
start = dict[s[i]];
数组下标可以是字符吗?
C++数组的下标可以是字符的。
解释如下:
1)C++中字符在计算机内存储的是字符的ASCII码;
2)而ASCII码实质是数字,例如‘a’是97,‘A’是65;
3)如果用字符作为下标,实质就是用该字符的ASCII码作为下标;
4)但是在用字符作为下标时没有数字直观,容易引起数组越界,因此不建议这样用。
C++中的基本数据类型分为两大类:整数和浮点数。其中的字符类型是一种特殊的整数类型,C++要求数组下标必须是整数类型,所以字符也是可以作为下标的。