最长不含有重复字符的子字符串

题目

  请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含‘a’~‘z’的字符。例如,在字符串“arabcacfr”中,最长的不含重复字符的子字符串是“acfr”,长度为 4

思路

  定义函数f(i)表示以第i个字符结尾的不包含重复字符的子字符串的最长长度,从左到右扫描,计算第i个字符串结尾的不包含重复的字符的子字符串的最长长度时f(i)时,已经知道f(i-1);

  1.   如果第i个字符之前没有出现过,那么f(i)=f(i-1)+1;
  2.   若果第i个字符之前出现过,那么先计算第i个字符和他上次出现在字符串中的位置距离,记为d

      1>.如果d<=f(i-1),意味着在第i个字符出现两次所夹得字符串串中间没有其他字符,第i个字符出现在f(i-1)所对应的最长字符串中。即f(i)=d;

      2>.如果d>f(i-1),此时第i个字符出现在f(i-1)对应的最长子字符串之前,所以仍然有f(i)=f(f-1)+1;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.empty()) {
            return 0;
        }

        int max_len = 0, cur_len = 0;
        vector<int> pos(128, -1);//每个字符上次出现在字符串位置的下标,-1是没有出现过
        for (int i = 0; i < s.size(); ++i) {
            int pre_index = pos[s[i]];//先获取每个字符第一次出现的位置
            if (pre_index < 0 || i - pre_index > cur_len) {//该字符没有出现过或者在f(i-1)之前出现过
                ++cur_len;
            }
            else {//在第个字符和f(i-1)之间出现
                max_len = max(max_len, cur_len);
                cur_len = i - pre_index;
            }
            pos[s[i]] = i;
        }
        return max(max_len, cur_len);
    }
};

 

posted on 2019-01-12 10:50  tianzeng  阅读(325)  评论(0编辑  收藏  举报

导航