给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解法:
curStr数组做临时的存储,当碰到重复字符,删除此字符在数组之前所有字符,包括本身。
每次需要重复判断下是否是最大长度
class Solution { func lengthOfLongestSubstring(_ s: String) -> Int { if(s == ""){ return 0 } var maxStr = String() var curStr = String() for char in s{ while curStr.contains(char) { curStr.remove(at: curStr.startIndex) } curStr.append(char) if(curStr.count > maxStr.count){ maxStr = curStr } } return maxStr.count } }
解题思路:
1、遍历字符串
2、判断数组里面能否查找到当前字符,查到的话,重新计算maxCount,然后把数组当前位置前面的元素删掉,然后插入当前元素
class Solution { func lengthOfLongestSubstring(_ s: String) -> Int { var array = [Character]() var maxCount = 0 for char in s { if let index = array.firstIndex(of: char) { // 如果存在的话,则删除之前数组,并记录个数 maxCount = max(maxCount, array.count) // 删除开头的几个元素 array.removeFirst(index + 1) } array.append(char) } return max(maxCount, array.count) } }
滑动窗口原理(目前最优)
窗口法,区间取值;
右区间(end)值恒增加(向右走);
左区间(start)值停留,若出现相等则取下一位(end + 1);
最后返回区间长度(ans).
class Solution { func lengthOfLongestSubstring(_ s: String) -> Int { if s.isEmpty { return 0 } var kv = [Character : Int]() var start = 0, end = 0, ans = 0 for item in s { if let record = kv[item] { //重置开始游标位置 start = max(record+1, start); } //记录字符在原字符串的位置 kv[item] = end //记录不同字符最大长度 ans = max(end - start + 1, ans) end += 1 } return ans } }