标签:
题目: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 };
【LeetCode】003 Longest Substring Without Repeating Characters
标签:
原文地址:http://www.cnblogs.com/kathyrine/p/4457996.html