3. Longest Substring Without Repeating Characters - LeetCode

LeetCode Problems Solutions

question description:问题描述

Given a string, find the length of the longest substring without repeating characters.
给定一个字符串,查找没有 重复字符 的 最长 子字符串的 长度。

Example:例如

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
pwke只是去掉了重复的字符,而不是其子字符串。

"aabcdefghmm"  这个的答案是 "abcdefghm" ,首先,需要是其 子字符串,然后,找出最长且不重复字符的那个。

Thinking

注意,我们要的是一个子字符串,而不是一个去掉重复字符的字符串。也就是需要从给定的字符串中截取一段最长的子字符串,满足没有重复字符的要求。
你可能还没有一个清晰的思路:
假设最终的子字符串是从给定的字符串的第一个字符开始的,我们是不是可以解决该问题了;
假设最终的字符串是从给定的字符串的第二个字符开始的,我们是不是也可以解决该问题了;
假设最终的字符串是从给定的字符串的第三个字符开始的,我们是不是也可以解决该问题了;

对于充满变数的开始字符,我们完全可以通过一个循环来解决。

solution with java

public int lengthOfLongestSubstring(String s) {
        
        int result = 0; //保存每次得到的最大的结果
//利用集合Set不能包含相同元素的特性来判断是否重复
        Set tmpSets = new HashSet();

        char[] characters = s.toCharArray();

        for (int i = 0; i < characters.length ; i++) {

            if (result > characters.length - i){
                break;
            }

            tmpSets.clear();

            // System.out.println("------->>>>>>>>>");
            // System.out.println(result);
            // System.out.println("------->>>>>>>>>");
            for (int j = i; j < characters.length ; j++) {

                if (!tmpSets.contains(characters[j])) { //集合中不包含
                    tmpSets.add(characters[j]);
                    // System.out.println(characters[j]);
                    //每次都需要更新,避免只有一个字符的情况
                    if (result < tmpSets.size()) {
                        result = tmpSets.size();
                    }

                }else{ //遇到重复的字符了,跳出循环。(对于两个for循环,里面的break只会跳出里面的for循环)
                    break;
                }

            }

        }

        return result;
        
    }

solution with swift

本题检测结果为: Time Limit Exceeded.通过了系统982/983道测试,最后一道测试,输入的字符串非常长,才导致出现这样的结果,但结果是正确的,在解答过程中需要优化。

func lengthOfLongestSubstring(_ s: String) -> Int {
        
//利用集合Set不能包含相同元素的特性来判断是否重复
        var tmpSets = Set()
        var result = 0// 保存每次得到的最大的结果
        var start = 0;
        
        for _ in s.characters {
            
            if result > s.characters.count - start {
                break
            }
            
            //剩下的字符串
            let tmpStr = s.substring(from: s.index(s.startIndex, offsetBy: start))
            
            start += 1
            
            tmpSets.removeAll()
            
            for indexChar in tmpStr.characters {
                
                if !tmpSets.contains(indexChar) { //集合中不包含
                    tmpSets.insert(indexChar)
                    //                    print(char);
                    //每次都需要更新,避免只有一个字符的情况
                    if result < tmpSets.count {
                        result = tmpSets.count
                    }
                    
                }else{ //遇到重复的字符了
                    break
                }
                
            }
            
        }
        
        return result;
    }

你可能感兴趣的:(3. Longest Substring Without Repeating Characters - LeetCode)