Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >POJ 1200 Crazy Search 查找有多少种不同的子串(hash)

POJ 1200 Crazy Search 查找有多少种不同的子串(hash)

作者头像
Michael阿明
发布于 2021-02-20 02:39:39
发布于 2021-02-20 02:39:39
56900
代码可运行
举报
运行总次数:0
代码可运行

题目链接: http://poj.org/problem?id=1200 题目大意:给定子串长度,字符中不同字符数量,以及一个字符串,求不同的子串数量。

1.采用map解题

把子串插入map,map自动去重,最后输出map的size 结果是超时的。

超时代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @description: http://poj.org/problem?id=1200,采用map解题
 * @author: michael ming
 * @date: 2019/5/8 16:14
 * @modified by: 
 */
#include <iostream>
#include <stdio.h>
#include <map>
#include <string>
using namespace std;
int main()
{
    size_t sublen, diffchar;
    scanf("%d%d",&sublen,&diffchar);
    map<string, int> substring;
    string str, substr;
    cin >> str;
    size_t len = str.size();
    for(size_t i = 0, j = i+sublen-1; j < len; i++,j++)
    {
        substr = str.substr(i, sublen);
        substring.insert(pair<string, int>(substr, 1));
    }
    cout << substring.size();
    return 0;
}

2.采用hash查找

  • 先将字符串中先后出现的字符映射成1,2,3,4…比如abac(1213)
  • 在将每个子串对应的sublen个字符哈希得到哈希值,因为题目说可能的子串组合小于1600万种,我们把得到的哈希值对1600万求模,存在数组中置为1(初始为0)。
  • 对后面的子串的哈希值在数组中检查,如果为0,则不存在,种类+1,如果为1,说明这种子串已存在,跳过,循环遍历字符串
  • hash可以实现O(1)时间复杂度查找,所以时间比较短。
  • 该题目情况下,所有子串要求的长度是一样的,用类似m进制数的哈希函数没有冲突,如果子串长度不要求一样,则以下求解方法存在冲突可能(一个很长的子串哈希完的哈希int值溢出了,即高位舍弃变成很小的数,这可能与短字符串的哈希值一样,造成冲突)。

AC代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @description: 计算子串的种数
 * @author: michael ming
 * @date: 2019/5/8 17:20
 * @modified by: 
 */
#include <iostream>
#include <string>
#include <memory.h>
using namespace std;
void chartoint(string &str, int *num)   //把字符中出现过的字符转成1开始的数字
{
    int value = 1;
    int len = str.size();
    for(int i = 0; i < len; ++i)
    {
        if(num[str[i]] == 0)
            num[str[i]] = value++;
    }
}
size_t hashfunc(int i, int j, int m, int *num, string &str)    //计算子串hash值
{
    int hashValue = 0;
    for(int k = i; k <= j; ++k)
        hashValue = hashValue*m + num[str[k]];
    return hashValue;
}
int main()
{
    const unsigned int max = 16000001;
    int num[300] = {0};
    size_t *hash = new size_t[max];
    memset(hash, 0, sizeof(hash));
    int sublen, m;
    int result = 0;
    string str;
    cin >> sublen >> m >> str;
    chartoint(str, num);
    for(int i = 0; i <= str.size()-sublen; ++i)
    {
        size_t hashValue = hashfunc(i, i+sublen-1, m, num, str)%max;
        if(!hash[hashValue])
        {
            result++;
            hash[hashValue] = 1;
        }
    }
    cout << result << endl;
    delete[] hash;
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
POJ 2785 有多少种4个数相加等于0的方案(二分查找 or hash)
题目链接: http://poj.org/problem?id=2785 题目大意:给定不超过4000行4个数,每列挑出来1个,使之和为0,有多少种方案。 1.二分查找法 1.1 思路: 对左边两列
Michael阿明
2021/02/20
5380
POJ 2785 有多少种4个数相加等于0的方案(二分查找 or hash)
POJ 3461 字符串匹配(KMP / 哈希(有推导))
1. 题目 1.1 题目链接 http://poj.org/problem?id=3461 类似题目:LeetCode 30. 串联所有单词的子串(字符串哈希) 1.2 题目大意 模式串在主串中出现
Michael阿明
2021/02/20
5060
POJ 3461 字符串匹配(KMP / 哈希(有推导))
POJ 3690 找星座(2D匹配)(未解答)
给定大的矩阵(天空的样子),然后给定若干小矩阵(可能的天空的一角) 求有多少个小矩阵是从大矩阵里抠出来的(2D匹配)
Michael阿明
2021/02/20
4280
POJ 3690 找星座(2D匹配)(未解答)
LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 解题思路: 1、简单思路:暴力破解法,时间复杂度O(n^3),肯定通不过。 2、动态规划法:(一般含“最XX”等优化词义的题意味着都可以动态规划求解),时
Linux云计算网络
2018/01/11
5920
LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
LeetCode热题100(子串篇)
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。
Yui_
2025/01/20
1280
LeetCode热题100(子串篇)
LeetCode: 3_Longest Substring Without Repeating Characters | 求没有重复字符的最长子串的长度 | Medium
题目: Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the lengt
Linux云计算网络
2018/01/11
4870
穿越数据迷宫:C++哈希表的奇幻旅程
在C++的世界中,哈希表是一种高效、独特的数据结构,被广泛应用于需要快速查找、插入、删除的场景。通过哈希函数将数据映射到表中,它不仅提高了操作效率,还在解决冲突时展现了精巧的设计。哈希表在算法的应用中尤为重要,无论是缓存、字典处理还是集合操作,都离不开它的身影。本篇博客将带你一步步深入理解哈希表的实现原理及其应用,让你在编码之路上更上一层楼。
suye
2024/11/19
3350
LeetCode 5994. 查找给定哈希值的子串(字符串哈希)
给定整数 p 和 m ,一个长度为 k 且下标从 0 开始的字符串 s 的哈希值按照如下函数计算:
Michael阿明
2022/03/10
2.1K0
LeetCode 5994. 查找给定哈希值的子串(字符串哈希)
POJ1003/1004/1005/1207/3299/2159/1083/3094/2388解题(刷一波水题)
POJ 1003 题目链接 http://poj.org/problem?id=1003 大意:长度=1/2+1/3+…+1/n,给定长度值,求n #include<iostream> usi
Michael阿明
2021/02/20
2360
POJ1003/1004/1005/1207/3299/2159/1083/3094/2388解题(刷一波水题)
【优选算法】滑动窗口——leetcode——串联所有单词的⼦串(hard)
给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。
小李很执着
2024/08/05
2350
【优选算法】滑动窗口——leetcode——串联所有单词的⼦串(hard)
POJ 1936 字符匹配(水题)
题目链接: http://poj.org/problem?id=1936 题目大意: 给定字符a,b,问b中去掉一些字符后能不能得到a 解题思路: 暴力从前往后扫描一遍即可。 AC代码: /
Michael阿明
2021/02/20
3650
POJ 1936 字符匹配(水题)
C++STL——哈希
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到
有礼貌的灰绅士
2023/06/14
6170
C++STL——哈希
哈希(unordered_map、unordered_set)
通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立 一一映射的关系,那么在查找时通过该函数可以很快找到该元素。
芝士就是菜
2023/04/20
4340
哈希(unordered_map、unordered_set)
【动态规划】最长公共子串问题
题目有意思的地方在于,最长公共子串与最长连续公共子串都是比较经典的问题,但是这道题在其基础上加了限制。 首先这道题应该是最长连续公共子串问题,状态转移方程就不写了,挺简单的。就记录下最大的子串所在的位置的行坐标和列坐标,就能把子串拿到手。 但是对于O(nm)的动态规划所有点都会超时,这就很厉害了,目前通过的做法使用的是滑动窗口法,我还在研究。
千灵域
2022/06/17
3560
【c++】哈希>unordered容器&&哈希表&&哈希桶&&哈希的应用详解
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log_2N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对unordered_map和unordered_set进行介绍,unordered_multimap和unordered_multiset可查看文档介绍
用户10925563
2024/06/10
5070
【c++】哈希>unordered容器&&哈希表&&哈希桶&&哈希的应用详解
杨校老师课堂之字符串——string相关函数方法(二)
C++ string 类的常用函数及相关工具的详细总结,按功能分类整理,附代码示例:
杨校
2025/07/05
1690
【LeetCode热题100】【子串】最小覆盖子串
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""
叶茂林
2024/04/22
2220
哈希表
哈希表是一种数据结构。它通过哈希函数把数据和位置进行映射,来实现快速的寻找、插入和删除操作。
code-child
2023/05/30
3980
哈希表
【c++丨STL】string类的使用
之前我们对STL已经有了一些初步的了解,本篇文章我们正式开始学习STL。我们都知道,在C语言当中,有一些库函数:strlen、strcpy、strcmp、strstr......它们都是处理字符串的函数。但是这些函数的定义与字符串是分离的,并不符合面向对象编程的思想。c++标准库当中,定义了一个类用于表示字符串及其操作,叫做string。string类最开始并不属于STL,但是它在c++标准库中的作用与STL紧密相连,于是成为了STL的一员。与C语言的字符数组和头文件string.h相比,string类具有更丰富的功能、更高的安全性和更便捷的操作方式。本篇文章,我们一起学习探讨string类的一些常用接口及使用方法。
ephemerals__
2024/10/24
4060
【c++丨STL】string类的使用
【C++探索之路】STL---string
走进C++的世界,也意味着我们对编程世界的认知达到另一个维度,如果你学习过C语言,那你绝对会有不一般的收获,感受到C++所带来的码云风暴~
用户11456817
2025/01/26
1900
【C++探索之路】STL---string
相关推荐
POJ 2785 有多少种4个数相加等于0的方案(二分查找 or hash)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验