来源:力扣(LeetCode)
链接: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" 是一个子序列,不是子串。
记住没有重复字段的第一个index和当前的index,算长度。有重复字段出现后,更新第一个index。
方法1-用for i in 0..<s.count,结果超时
func lengthOfLongestSubstring(_ s: String) -> Int {
var maxLen = 0
var characters = [Character:Int]()
var firstIndex = 0 //从哪里开始算长度,如果有重复的就从重复的后一位开始算
//遍历字符串,遍历过的,将字符处于第几位保存在字典中。
//如果字典里面有。firstIndex = 上一次出现这个字符index
//当前-firstIndex
for i in 0..<s.count {
let currentCharacter = s[s.index(s.startIndex, offsetBy: i)]
if characters[currentCharacter] != nil {
//
let beforeIndex = characters[currentCharacter]!
firstIndex = max(beforeIndex, firstIndex)
}
maxLen = max(i + 1 - firstIndex, maxLen)
characters[currentCharacter] = i+1
}
return maxLen
}
方法2-for currentCharacter in s。通过
func lengthOfLongestSubstring(_ s: String) -> Int {
var maxLen = 0
var characters = [Character:Int]()
var firstIndex = 0 //从哪里开始算长度,如果有重复的就从重复的后一位开始算
var currentIndex = 0
//遍历字符串,遍历过的,将字符处于第几位保存在字典中。
//如果字典里面有。firstIndex = 上一次出现这个字符index
//当前-firstIndex
for currentCharacter in s {
if characters[currentCharacter] != nil {
//
let beforeIndex = characters[currentCharacter]!
firstIndex = max(beforeIndex, firstIndex)
}
maxLen = max(currentIndex + 1 - firstIndex, maxLen)
characters[currentCharacter] = currentIndex+1
currentIndex += 1
}
return maxLen
}
网友评论