• LeetCode Longest Substring Without Repeating Characters


    Problem

    My Answer in C++

    A.O(n^2) => TLE

    class Solution {
    public:
        int lengthOfLongestSubstring(string s)
    };
    
    int hashmap[505];
    
    bool hashmapjudge(string s, int l, int r) { // using hashmap judge whether the string has repeat character or not
        bool ans = true;
        
        memset(hashmap, 0, sizeof(hashmap));
        
        for (int i = l; i <= r; i++) {
            int index = int(s[i]);
            
            if (hashmap[index] == 1) {
                ans = false; break;
            }
            else hashmap[index] = 1;
        }
        
        return ans;
    }
    
    int Solution::lengthOfLongestSubstring(string s) {
        int ans = 0;
        
        if (s.length() == 1) return 1;
        
        for (int i = 0; i < s.length(); i++) {
            for (int j = 0; j < s.length(); j++) {
                if (hashmapjudge(s, i, j)) {
                    if (j-i+1 > ans) ans = j-i+1;
                }
            }
        }
        
        return ans;
    }
    
    

    B.O(n) => Accept

    class Solution {
    public:
        int lengthOfLongestSubstring(string s)
    };
    
    int hashmap[505]; // using hashmap record the character's pla
    
    int Solution::lengthOfLongestSubstring(string s) {
        int ans = 0, start = 0;
        
        memset(hashmap, -1, sizeof(hashmap));
        
        if (s.length() == 0) return 0;
        if (s.length() == 1) return 1;
        
        for (int i = 0; i < s.length(); i++) {
            int index = int(s[i]);
            
            // refresh start
            if (hashmap[index] != -1 && hashmap[index]+1 > start)
                start = hashmap[index]+1;    
            
            if (i-start > ans) ans = i-start;
            
            // refresh character's pla in hashmap(using ASCII index)
            hashmap[index] = i;
        }
        
        return ans+1;
    }
    

    Details

    Better Solutions

    Better Solutions

    Feelings and Review

    总的来说,本题难度一般(废话)。

    1.首先要做的是理解题意,题目求所有满足要求的特殊字符串中最长字符串的长度,这个字符串里面的字符都是不重复的。

    2.本题实现起来较为容易,但是需要冷静,暴力解决不了问题,O(n^2)的算法(即上文中的A解法)不能过最后一个样例(非常长),因此需要考虑算法的优化。

    3.我所考虑的一种算法是,遍历一遍字符串,一个是根据由散列(index是字符的ASCII码)将字符串中的每一个字符出现的位置记录下来并不断更新;另一个是维护特殊字符串的首指针(start):当出现重复的字符时,将首指针移动到这个重复字符上一次出现位置的下一位(比如重复字符'a'上一次出现的位置是3,start就移动到4),但是前提是首指针不能倒退!(考虑样例:abssba)。

    最后,在这个遍历的过程中,不断判断和更新answer即可。时间复杂度O(n)。

    2017/2/3

  • 相关阅读:
    react Native 运行报错之一 gradle-2.14.1-all解压失败的问题
    react native windows create bundle folder
    gulp+browserSync+nodemon 实现express 全端自动刷新的实践
    nodejs框架express4.x 学习--安装篇
    转: angularjs 指令中动态编译的方法(适用于有异步请求的情况) 内嵌指令无效
    angular 基础练习
    自己写的数组排重+排序
    前端开发bower包管理器
    定位网站性能的一些经验
    记一次大规模数据迁移和加密
  • 原文地址:https://www.cnblogs.com/qq952693358/p/6363240.html
Copyright © 2020-2023  润新知