剑指Offer——最长不包含重复字符的子字符串

Solution

动态规划。 f(i)表示包含第i个字符的最长子串。

  1. 如果第i个字符没在之前出现过,那么f(i) = f(i - 1) + 1

  2. 如果第i个字符在之前出现过,这个时候应该分两种情况,假设与之前出现的距离为d,如果d>f(i - 1) 说明之前出现的字符不在f(i - 1)包含的字符串内,那么f(i) = f(i - 1) + 1, 如果d <= f(i - 1),说明包含的重复字符在f(i - 1)内,那么f(i) = d.

Code

class Solution {
public:
    int find_str(string str) {
        int len = str.length();
        if (len <= 1)
            return len;

        map<char, int> table;
        vector<int> dp(len, 0);
        table[str[0]] = 0;
        dp[0] = 1;

        int res = 1;
        for (int i = 1; i < len; i++) {
            if (table.find(str[i]) != table.end()) {
                int d = i - table[str[i]];
                if (d <= dp[i - 1])
                    dp[i] = d;
                else
                    dp[i] = dp[i - 1] + 1;
            } else {
                dp[i] = dp[i - 1] + 1;
            }
            if (dp[i] > res)
                res = dp[i];

            table[str[i]] = i;
        }
        return res;
    }


};
原文地址:https://www.cnblogs.com/zhonghuasong/p/7771623.html