【LeetCode】003 Longest Substring Without Repeating Characters

题目:LeetCode 003 Longest Substring Without Repeating Characters

题意:给一个字符串,找到一个没有重复字符的最长子串。

样例:”bbbbb” 返回”b”的长度1;”abcabcbb”返回”abc”的长度3。

 

思路:

动态规划。dp[i]表示以第i个字符为结尾的无重复字符的子串的最长的长度,需要一个辅助数组idx[s[i]]记录字符当前字符s[i]上一次出现的位置,如果未出现过则为-1。所以得到如下的递推公式:

另外由于不确定字符串长度的范围,所以利用滚动数组实现。dp[i&1]由dp[(i-1)&1]推导而来。

代码如下:

 1 class Solution {
 2 public:
 3     int lengthOfLongestSubstring(string s) {
 4         int len = s.length();
 5         if(len == 0) return len;
 6         int ans = 1, idx[300], dp[2];
 7         memset(idx, -1, sizeof(idx));
 8         dp[0] = 1;
 9         idx[s[0]] = 0;
10         for(int i = 1; i < len; i++)
11         {
12             if(idx[s[i]] == -1)
13                 dp[i&1] = dp[(i-1)&1]+1;
14             else
15                 dp[i&1] = min(i-idx[s[i]], dp[(i-1)&1]+1);
16             idx[s[i]] = i;
17             ans = max(ans, dp[i&1]);
18         }
19         return ans;
20     }
21 };

 

posted @ 2015-04-26 17:09  二喵de喵  阅读(117)  评论(0编辑  收藏  举报