您的位置:首页 > Web前端

剑指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;
}
};
  • 点赞
  • 收藏
  • 分享
  • 文章举报
LonelyVM 发布了81 篇原创文章 · 获赞 1 · 访问量 487 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐