请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
解题思路:
1.使用《剑指offer》上的解题思路:
2.使用动态规划+哈希表方法。
3.更新规则:f(i)代表以第i个字符为结尾字符的最长不重复字符串长度,此为dp数组(但是代码中没有使用O(n)的空间建立一个数组,由于只需要获得最大长度,使用打擂台的方式获取最大值即可。)
对于第i个字符,如果该字符未在哈希表中出现过,那么f(i)=f(i-1)+1;
如果它在哈希表中出现过,那么分为两种情况:(1)如果它最后一次出现的位置距离第i个字符的位置之差大于f(i),那么
f(i)=f(i-1)+1;(2)如果它最后一次出现的位置距离第i个字符出现的位置小于f(i),那么f(i) = 距离差。
4.position数组记录字符最近一次出现的位置。
易错点:
当按照书上思路写完时:报错heap-use-after-free,发现是 position[s[i]-‘a’]引起的,将其改成 position[s[i]-’ ']即可,原因是用例中的字符可能是字母以外的字符,例如数字,空格,其他符号等。ascci码中第一个可打印字符是空格,用这种方式,不用出现数组索引为负号或者越界的问题了。(越界问题可以扩大position哈希表的容量,我是从26扩大成100即可)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.length()<=0) return 0;
int curLength=0;
int maxLength=0;
int *position = new int[100];
for(int i=0;i<100;++i){
position[i] = -1;
}
for(int i=0;i<s.size();++i){
int prePosition = position[s[i]-' '];
if(prePosition<0||(i-prePosition)>curLength){
++curLength;
}else{
if(curLength>maxLength){
maxLength = curLength;
}
curLength = i-prePosition;
}
position[s[i]-' '] = i;
}
if(curLength>maxLength){
maxLength = curLength;
}
delete []position;
return maxLength;
}
};