leetcode——无重复字符的最长字串(java)
给定一个字符串 s
,请你找出其中不含有重复字符的 最长 子串的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题方法:(不定长滑动窗口)
1.经分析,很明显使用不定长滑动窗口来进行解题,并且涉及到字符串的切片,所以我们需要一个StringBuilder
来充当滑窗。
2.还需要注意的是这时候先把字符串转化为字符数组比较好操作。
3.开始遍历字符数组,将滑窗中没有的字符添加进去,直到出现重复字符,不再添加,开始删除,使用切片删除,最后在添加元素进入滑窗。
4.记得最后也还要更新一下结果,因为最后一次滑窗很可能没有重复字符,没有进入到else
中更新结果。
class Solution {
public int lengthOfLongestSubstring(String s) {
int ans = 0;
StringBuilder tmp = new StringBuilder();
char[] ns = s.toCharArray();
int n = ns.length;
for (int i = 0; i < n; i++) {
if (tmp.indexOf(String.valueOf(ns[i])) == -1) {
tmp.append(ns[i]);
} else {
int cur = tmp.length();
ans = Math.max(cur, ans);
tmp.delete(0, tmp.indexOf(String.valueOf(ns[i])) + 1);
tmp.append(ns[i]);
}
}
ans = Math.max(tmp.length(), ans);
return ans;
}
}