剑指offer48. 最长不含重复字符的子串 P236 leetcode 3
2020-01-14 20:53
183 查看
剑指offer48. 最长不含重复字符的子串 P236 leetcode 3
题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。
用压缩优化后的dp,(只用ans_cur一个变量存,不用数组)
int longestSubstringWithoutDuplication(const string str) { if (str == "") return 0; int ans = 0, ans_cur = 0; // ans存当前最大的长度,ans_last存dp[i]长度 int hash[27]; // 存上一次这个字母出现的位置 fill(hash, hash + 27, -1); for (int i = 0; i < str.length(); ++i){ int temp = str[i] - 'a'; // 当前字符第一次出现,或者在这两个重复字符之间已经有别的重复字符出现, // 已经更新过当前的ans_cur了。 if (hash[temp] == -1 || i - hash[temp] > ans_cur) { // 后一个条件容易忽略!!! ++ ans_cur; } else { ans_cur = i - hash[temp]; // 更新当前的dp[i]长度 } ans = ans > ans_cur ? ans : ans_cur; // 看历史最大长度和当前长度谁大 hash[temp] = i; // 更新这个字符最近一次出现的索引i } return ans; } 解法2:用trick :start变量来代替hash表 int lengthOfLongestSubstring(string s) { vector<int> dict(256, -1); // 用来记录字符上次出现的位置 int maxlen=0, start = -1; for (int i = 0; i != s.length(); i++){ // s[i]字符上次出现的下标是否在start之后,若是,则重复了,则修改start为上一次s[i]的位置,从它后一位开始搜索 if (dict[s[i]] > start) start = dict[s[i]]; dict[s[i]] = i; maxlen = max(maxlen, i - start); } return maxlen; } };
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 剑指Offer-48:最长不含重复字符的子字符串
- 牛客剑指Offer面试题48:最长不含重复字符的子字符串(与LeetCode第三题要求不同)
- 剑指offer面试题48: 最长不含重复字符的子字符串
- 【Java】面试题48:最长不含重复字符的子字符串
- 剑指Offer(第二版)面试题48:最长不含重复字符的子字符串
- 3. Longest Substring Without Repeating Characters(计算不含重复字符的最长子串的长度)
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 求字符串最长不含重复字符的子串长度
- 字符串中最长不含重复字符的子串
- 字符串最长不含重复字符的子串长度
- 求字符串中不含重复字符的最长子串的长度
- 剑指Offer——最长不包含重复字符的子字符串
- 贪心法应用:不含重复字符的最长子串
- 百度面试题 求字符串中不含重复字符的最长子串长度
- Longest Substring Without Repeating Characters 不含重复字符的最长子串
- 求字符串中不含重复字符的最长子串的长度
- 剑指offer-最长无重复子串的长度
- 在英文字符串中找第一个最长不含重复字符的子串高效实现(修改版)
- C++找出字符串中最长的不含重复字符的子串