Longest Substring Without Repeating Characters
给定一个字符串,寻找最长不重复子串长度。
难度:中等
比如:
"abcabcbb",结果是"abc" 长度为3
“bbbbb” 结果为b,长度为1
"pwwkew" 结果为wke,长度为3
此题很容易想到O(n^3)的解法即枚举所有子串O(n^2),然后判断每个子串是否有重复的字符O(n),所以总的时间复杂度为O(n^3)。当然如果这样解的话就丧失了这道题的意义了(不知道这种解法会不会超时)。下面介绍一个O(n^2)的解法。
对于任意一个子串ai,ai+1,ai+2,ai+3......aj 假设这个子串内部没有重复的字符,那麼当aj+1加入的时候只需要判断aj+1在之前找到的子串内部有没有相同的字符O(n),假设存在一个字符ak满足ak==aj+1,那麼刚刚找到的[ai,aj]子串就需要从位置k处断开来接受aj+1即变成[ai,ak],[ak+1,aj+1]此时计算子串长度合法的子串集合有[ai,ak],[ak+1,aj+1],[ai,aj],比较三种子串那个比较长即可结果保存在iResult里面,然后j往后继续组子串每次碰到有相同的字符的时候就根据上述的三个子串那个较长即可O(n),所以总复杂度为O(n^2)。代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int i, j, k = -1;//程序开始时,k位置不存在所以初始值为-1
int iLen = s.length();
int iResult = 1;
for(j = 1; j < iLen; j ++)//扫描ai,ai+1,ai+2....aj,寻找位置k
{
for(i = j - 1; i > k; i --)
{
if(s[i] == s[j])
{
k = i;
break;
}
}
iResult = iResult > (j - i) ? iResult : (j - i);//取值
}
if(iLen == 0)
iResult = 0;
return iResult;
}
};