题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解析
我采用的是滑动窗口法,保证窗口中无重复串。先创建一个集合,存储窗口中的字符,遍历字符串,如果当前字符不在集合中,窗口右边滑,并将当前字符存到集合中,计算窗口大小,与之前的值比较,取较大的值;如果当前字符在集合中,从集合中移除窗口最左边的字符,窗口左边右滑
swift需要注意的一点,字符串的index不要采用String.index(, offsetBy: )这个方法,当offsetBy的参数较大时,效率极低,我这里采用的是先将字符串转成字符数组,然后从字符数组通过下标取字符串
代码(swift)
func lengthOfLongestSubstring(_ s: String) -> Int {
var left = 0
var right = 0
var maxLength = 0
var set = Set<Character>()
let sArr = Array<Character>(s)
let sCount = sArr.count
while right < sCount {
let str = sArr[right]
if set.contains(str) {
set.remove(sArr[left])
left += 1
} else {
right += 1
set.insert(str)
maxLength = max(maxLength, right - left)
}
}
return maxLength
}