• 哈希表解决字符串问题


    题目5:无重复字符的最长子串

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

    示例 1:

    输入: "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

    示例 2:

    输入: "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

    示例 3:

    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
         请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

     方法一:

    //思路:控制区间的所有元素没有重复,使用哈希表来判断。每次重复的时候清空
    //哈希表
    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            
            int len = s.size();
            int hashmap[256] = {0};
            int flag = 0;
            int current = 0;
            int result = current;
            int i=0;
            for(i=0;i<len;i++)
            {
                if(hashmap[s[i]] != 0)
                {
                    //这个子串有重复
                    current = i-flag;
                    if (result < current)
                        result = current;
                    //清除哈希表
                    for(;flag<i;flag++)
                    {
                        if(s[flag]!=s[i])
                            hashmap[s[flag]] = 0;
                        else
                            break;
                    }
                    hashmap[s[i]] = 1;
                    flag++;
                }
                else{
                    hashmap[s[i]] = 1;//置0
                }
            }
            //处理没有重复的情况。
            current = i-flag;
            if (result < current)
                result = current;
    
            return result;
        }
    };

    方法二:

    //方法二:滑动窗口 就是我的方法的进阶。使用hash表来存储字符串上次出现的位置
    int lengthOfLongestSubstring(string s) {
            vector<int> hash(256,-1);
            int left = -1;
            int ans = 0;
            for(int i=0;i<s.size();++i){
                if(hash[s[i]] > left){
                    left = hash[s[i]];
                }
                ans = max(ans,i-left);
                hash[s[i]] = i;
            }
            return ans;
        }

    题目387 

    字符串中的第一个唯一字符

    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

    案例:

    s = "leetcode"

    返回 0.
    
    s = "loveleetcode",
    返回 2.

    题解:

     题解,使用hash表对字符出现的个数进行统计,之后再次遍历字符串查找hash表即可。注意出现次数问题的都可以用这个思路来求解!

    // @lc code=start
    class Solution {
    public:
        int firstUniqChar(string s) {
            int len = s.size();
            int result = 0;
            int hashmap[256] = {0};
            for(int i=0;i<len;i++)
            {
                hashmap[s[i]]++;
            }
            for(int i=0;i<len;i++)
            {
                if(hashmap[s[i]]==1)
                    return i;
            }
            return -1;
    
        }
    };//不要遍历哈希表,再遍历一次字符串就好!!!
  • 相关阅读:
    自动识别文本中最能体现文本的主题和风格的词汇?试想一下,要找到一本 书中使用最频繁的 50 个词
    语言处理任务 NLTK 模块 功能描述
    mysql group by 去重 分类 求和
    isinstance(object, classinfo) class type(name, bases, dict)
    函数式编程 偏函数 生成器 yield
    .bash_profile vs .bashrc
    sh/bash/csh/Tcsh/ksh/pdksh等shell的区别
    从数据库、页面加载速度角度思考 id设计 sku asin
    线性回归
    Oracle OLAP
  • 原文地址:https://www.cnblogs.com/SK1997/p/11964360.html
Copyright © 2020-2023  润新知