题目:
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
(1)给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
(2)给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
(3)给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。
func lengthOfLongestSubstring(_ s: String) -> Int {
var ans:Int = 0
let n = s.count
var letters = Set<Character>()
var result = [Int]()
//检测数组中是否包含一个数大于了字符串长度的一半,这样可以减少时间复杂度,定一个Bool值
var isJumpToEnd = false
for i in 0..<n {
letters.removeAll()
let index = s.index(s.startIndex, offsetBy: i)
letters.insert(s[index])
if isJumpToEnd {
break;
}
for j in i+1...n {
let index2 = s.index(s.startIndex, offsetBy: j)
//采用集合的形式,每次从字符串取出一个字符,便做一次查询,没有就加进去,有的话就记录数值,加入数组,然后开启下一次循环
if letters.contains(s[index2]) {
ans = j - i
result.append(ans)
if ans >= n/2 {
isJumpToEnd = true
}
break
}else{
letters.insert(s[index2])
}
}
}
var max:Int = result[0]
for index in 0..<result.count {
if result[index] > max {
max = result[index]
}
}
return max
}
以上答案纯属个人答案,在LeetCode提答案时,报错:超出范围,检测目前的循环没找到越界,暂时不提了,等再优化看看
简单描述下个人思路:
1、利用集合Set去对字符串中的每一个Character进行操作,不同的进行保存,直到碰到相同元素,计算此时字符串最大长度
2、两次for...in遍历字符串,进行添加集合的Character对比
3、将每次记录的字符串最大长度保存在一个数组中,然后从数组中找寻一个最大的值,即为字符串的最大长度返回即可
ps:检测数组中是否包含一个数大于了字符串长度的一半,这样可以减少时间复杂度,定一个Bool值 isJumpToEnd
利用LeetCode平台继续深入学习swift的语法部分,继续加油了!
写的不好,请指教!