哈希表解决字符串问题

题目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;

    }
};//不要遍历哈希表,再遍历一次字符串就好!!!

原文地址:https://www.cnblogs.com/SK1997/p/11964360.html

时间: 2024-10-14 03:08:06

哈希表解决字符串问题的相关文章

哈希表解决冲突链地址java

package ch17; import java.math.BigInteger; public class HashTable { private LinkList[] arr; /** * 默认的构造方法 */ public HashTable() { arr = new LinkList[100]; } /** * 指定数组初始化大小 */ public HashTable(int maxSize) { arr = new LinkList[maxSize]; } /** * 插入数据

哈希表解决冲突法(二次探测)

故数据存储下标为 伪代码: 1. //index=_HashFunc(key); //++i; //index+=(2*i-1); size_t _HashFunc(const K& key) { return key%_capacity; } 2.//index=_HashFunc(key,++i); size_t _HashFunc(const K& key,size_t i) { return (key+i*i)%_capacity; } #pragma once #include&

哈希表实现

哈希表实现: 使用BKDRHash作为基础的哈希函数,同时使用拉链法作为冲突处理方法,实现哈希表的插入和查找操作. 哈希函数BKDRHash实现如下: 1 //映射方法,BKDRHash方法 2 static int32_t BKDRHash(const string& str){ 3 int32_t hash=0,seed = 131; 4 for(uint32_t i=0;i<str.length();i++){ 5 hash = hash * seed + str[i]; 6 } 7

哈希表之三冲突解决

前的部分分析了,哈希表中的冲突时难以避免的,冲突是很正常的,所以就要知道如何解决冲突. 我觉得冲突是有两种解决的方法: 1.横向的解决 2.纵向的解决 所谓横向解决:指的是对冲突的键,会在哈希表上另外找一个位置来安放它: 纵向解决是指:在冲突的键上会有一个线性链表,来存储冲突的元素. "处理冲突"就是为该关键字的记录找到一个"空"的哈希地址. 在处理冲突时,可能得到一个地址序列: 在处理冲突的时候,如果得到另一个哈希地址H1让然发生冲突,则会继续计算下一个地址H2,

哈希表之开地址法解决冲突

在上一篇博文中,我们讲述了使用链地址法解决冲突的方法.这里我们介绍另一种方式:开地址法解决冲突. 基本思想:当关键码key的哈希地址H0 = hash(key)出现冲突时,以H0为基础,产生另一个哈希地址H1 ,如果H1仍然冲突,再以H0 为基础,产生另一个哈希地址H2 ,-,直到找出一个不冲突的哈希地址Hi ,将相应元素存入其中.根据增量序列的取值方式不同,相应的再散列方式也不同.主要有以下四种: 线性探测再散列 二次探测再散列 伪随机探测再散列 双散列法 (一)线性探测再散列 理解起来很简单

哈希表和冲突解决

1.散列表 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度.这个映射函数称做散列函数,存放记录的数组称做散列表. 2.散列函数 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快定位. (1). 直接定址法:取关键字或关键字的某个线性函数值为散列地址.即{ hash(k)=k} 或{ hash(k)=a*k+b}

字符串哈希表

从第一个字符串中删除在第二个字符串中出现的所有字符 "We are students" "aeiou" "W r studnts" 我们可以设置两个指针pfast和pslow,初始化时两个都指向字符串中的第一个字符,pfast碰到一个需要删除的字符直接跳过:pfast如果碰到不需要删除的字符,就把该字符复制给pslow,同时pfast后移(继续需找),pslow(指向下一个位置).这样整个算法的时间复杂度就可以达到O(n).而如何判断该字符是否需

开地址哈希表(Hash Table)的原理描述与冲突解决

在开地址哈希表中,元素存放在表本身中.这对于某些依赖固定大小表的应用来说非常有用.因为不像链式哈希表在每个槽位上有一个"桶"来存储冲突的元素,所以开地址哈希表需要通过另一种方法来解决冲突. 解决冲突的方法 在开地址哈希表中,解决冲突的方法就是探查这个表,直到找到一个可以放置元素的槽. 例如,插入一个元素时,我们探查槽位直到找到一个空槽,然后将元素插入此槽中.删除或查找一个元素时,我们探查槽位直到定位到该元素或找到一个空槽.如果在找到元素之前找到一个空槽或遍历完所有槽位,那么说明此元素在

深入理解哈希表

有两个字典,分别存有 100 条数据和 10000 条数据,如果用一个不存在的 key 去查找数据,在哪个字典中速度更快? 有些计算机常识的读者都会立刻回答: “一样快,底层都用了哈希表,查找的时间复杂度为 O(1)”.然而实际情况真的是这样么? 答案是否定的,存在少部分情况两者速度不一致,本文首先对哈希表做一个简短的总结,然后思考 Java 和 Redis 中对哈希表的实现,最后再得出结论,如果对某个话题已经很熟悉,可以直接跳到文章末尾的对比和总结部分. 哈希表概述 Objective-C 中