这题仍然是3年前的作品,中等难度的一道题目,每次看自己以前写的代码,毫无注释,然后重新去理解自己的思路,去写解题思路真是痛苦啊...以后得慢慢补上这些注释.
原题地址:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路:
我当时提交的解题思路是:从头往后遍历,判断当前的字符是否在当前的StringBuilder字符子串中,如果不在就添加进字符子串里面,否则判断当前字符子串的长度和之前的最长字符子串长度,取最大值;
现在的想法是,不用StringBuilder,直接用HashSet,保证无重复,减少StringBuilder.indexOf的时间消耗;比较最长的长度时,直接获取HashSet.size();
个人题解:
public int lengthOfLongestSubstring(String s) {
int max = 0;
StringBuffer sb = new StringBuffer();
for (char c : s.toCharArray()) {
if (sb.indexOf(String.valueOf(c)) == -1) {
sb.append(c);
} else{
max = (max >= sb.length() ? max : sb.length());
sb.delete(0, sb.indexOf(String.valueOf(c)) + 1);
sb.append(c);
}
}
return (max >= sb.length() ? max : sb.length());
}
结果:
这题的结果相对第二题就好点了...不过还是只有50+%的水准