LeetCode之路(swift) - 给定一个字符串,找出不含

2018-05-31  本文已影响74人  echo海猫

题目:
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
(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的语法部分,继续加油了!
写的不好,请指教!

上一篇下一篇

猜你喜欢

热点阅读