您的位置:首页 > Web前端

剑指offer-最长无重复子串的长度

2018-01-04 22:01 148 查看
剑指offer-最长无重复子串的长度

题目描述:从字符串中找出一个最长的不包含重复字符的子字符串,计算其长度。如arabcacfr中,最长无重复的子串是acfr,长度为4。

题目解析:

这道题可以利用动态规划的手段去解决。

设 f(i) 就是以i字符结尾的最长无重复子串。

那么就有两种情况:1. i之前没有出现过。很容易理解 f(i) = f(i-1) + 1,如上面例子中第一个r,f(i-1)=1(“a”),r是第一次出现,并不会出现重复的情况

                              2. i之前出现过: 

                                  这里又需要分两种情况去考虑:1. d(i与i上一次出现的距离) > f(i-1)  f(i)=f(i-1)+1。 例如这种情况  a r
a b c a c fr,对于r来说并不影响以它结尾的最长子串。

                                                                                 2. d(i与i上一次出现的距离) <=f(i-1) f(i) = d。 例如这种情况  a r
a b c a c f r,说明a出现的位置在上一次f(i-1)中,这时以a结尾的最长无重复子串长度就是d。

                             需要注意的是应当设定一个全局变量max,去记录当前最大值,d与max需要进行比较,得到最大的值。                      

代码(C++实现)

class DistinctSubstring {
public:
int longestSubstring(string A, int n) {
int ret=0;
int curLength=0;
int* position = new int[26];
for(int i = 0;i<26;i++)
position[i] = -1;

for(int i = 0;i< A.size();i++)
{
int prevIndex = position[A[i]-'a'];
if(i-prevIndex>curLength || prevIndex==-1 )
{
curLength++;
}
else{
// if(curLength>ret)
// ret = curLength;
curLength = i - prevIndex;
}
position[A[i]-'a']=i;
if(curLength>ret)
ret = curLength;
}
return ret;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息