【Programming Pearls】查找一段文本或单词中的最长重复子串

【Cadence 17.4实战】----- 基于MySQL与ODBC的企业级CIS数据库配置全攻略 本文详细介绍了如何在Cadence 17.4中配置基于MySQL与ODBC的企业级CIS数据库,提升硬件设计团队的元器件管理效率。通过实战案例和避坑指南,帮助读者掌握数据库部署、ODBC驱动配置及CIS参数映射等关键技巧,实现设计数据的实时同步与高效管理。 阅读详情

           给定一个文本文件,查找最长的重复子串。

 如文本“Ask not what your country can do for you, but what you can do for your country”,最长的重复子串为“can do for you”和“your country”。单词banana的最长重复子串为“ana“。该问题可以看成是一个由颠倒字母组成的单词组合问题。假设该输入字符串保存在c[0…,n-1]数组中,一般比较常见的做法是用下面的伪代码来比较每个子串。

maxlen = -1

for i = [0, n)

for j = (i, n)

if (thislen = comlen(&c[i], &c[j])) > maxlen

maxlen = thislen

maxi = i

maxj = j

comlen()函数返回两个字符串中相同的最长的字符数目,从第一个字符开始计算。

int comlen(char *p, char *q)

i = 0

while *p && (*p++ == *q++)

i++

return i

 

由于上面的算法要比较所有可能的子串对,所以时间复杂度比较高,为o(n^2)。我们可以采用“后缀数组“来降低它的时间复杂度。

假设处理的文本的字符总数最多为MAXN,保存在数组c中。

#define MAXN 5000000

char c[MAXN], *a[MAXN];

其中数组a为后缀数组。

 

初始化代码如下:

while (ch = getchar()) != EOF

a[n] = &c[n]

c[n++] = ch

c[n] = 0

 

其中a[0]指向整个字符串,a[1]指向从第二个字符开始往后的所有字符,依次类推。如下:

a[0]: banana

a[1]: anana

a[2]: nana

a[3]: ana

a[4]: na

a[5]: a

 

如果一个长字符串在C中出现两次,它们的后缀不相同。然后按照字母顺序对数组a的字符串进行排序,然后比较相邻的字符串,找出最长的重复子串为ana。

a[0]: a

a[1]: ana

a[2]: anana

a[3]: banana

a[4]: na

a[5]: nana

 

这里采用qsort对“后缀数组“进行排序。

qsort(a, n, sizeof(char *), pstrcmp);

 

用下面的代码比较相邻字符串的最大长度:

for i = [0, n)

if comlen(a[i], a[i+1]) > maxlen

maxlen = comlen(a[i], a[i+1])

maxi = i

printf("%.*s\n", maxlen, a[maxi])

 

 

完整的代码如下:

#include <stdlib.h>

#include <string.h>

#include <stdio.h>

int pstrcmp(char **p, char **q)

{ return strcmp(*p, *q); }

int comlen(char *p, char *q)

{ int i = 0;

while (*p && (*p++ == *q++))

i++;

return i;

}

#define M 1

#define MAXN 5000000

char c[MAXN], *a[MAXN];

int main()

{ int i, ch, n = 0, maxi, maxlen = -1;

while ((ch = getchar()) != EOF) {

a[n] = &c[n];

c[n++] = ch;

}

c[n] = 0;

qsort(a, n, sizeof(char *), pstrcmp);

for (i = 0; i < n-M; i++)

if (comlen(a[i], a[i+M]) > maxlen) {

maxlen = comlen(a[i], a[i+M]);

maxi = i;

}

printf("%.*s\n", maxlen, a[maxi]);

return 0;

}

 


STM实战开发(13):STM32开发:使用光敏电阻检测光照强度 光敏电阻(LDR)是一种电阻值受光照强度影响的半导体材料。当光照强度增大时,光敏电阻的电阻值降低;而当光照强度减小时,电阻值则增大。光敏电阻的电阻变化与入射光的强度之间并不是线性关系,而是呈对数型的变化。LDR通常由硫化镉(CdS)或其他半导体材料构成,材料对不同波长的光有不同的响应特性。一般而言,光照强度越强,光敏电阻的电阻值越低,反之则越高。本文介绍了如何使用STM32与光敏电阻(LDR)结合,进行光照强度检测的实现方法。通过配置STM32的ADC模块,读取光敏电阻的电压信号,并根据电压计算光照强度。 阅读详情

相关推荐

Cartographer从安装到实战:手把手教你运行2D/3D建图与定位

本文提供了一份详尽的Cartographer从零安装到实战应用的完整指南。内容涵盖环境准备、依赖编译、源码构建等关键步骤,并手把手指导读者运行2D/3D官方数据集进行建图与定位测试。文章深入解析了参数配置与自定义数据适配方法,帮助开发者快速掌握这一强大的实时同步定位与建图工具,并将其应用于机器人导航与自动驾驶等实际场景。

rice5的博客 949

(LeetCode1044)最长重复子串:给出一个字符串S,返回其最长重复子串

题目描述 给出一个字符串 S,考虑其所有重复子串(S 的连续子串,出现两次或多次,可能会有重叠)。 返回任何具有最长可能长度的重复子串。(如果 S 不含重复子串,那么答案为 ""。) 方法1:后缀数组法 // 后缀数组法 import java.util.Arrays; class Solution { public String longestDupSubstring(String S...

qq_34826261的博客 2万+

AMCL代码详解(六)amcl中的重采样

每次都从w1左边的竖线开始转,显而易见,转到w1的概率为0-w1之间的随机数,转到w2的概率为w1到w1+w2之间的随机数,转到w3的概率为w1+w2到w1+w2+w3之间的随机数,后面的依次类推。当某个粒子的权值较大的时候,产生的随机数落在相应区间的概率就会增大,从而实现了对权值大粒子的多次复制,权值小的粒子的剔除。可以看出,在整个重采样的过程中,粒子进行了两次种情况的刷新,一种是随机生成的新的粒子,一种是对原来的粒子的复制。得到的值越大,说明粒子的权重越小,当前粒子的可信度比较小,需要重采样粒子。

YiYeZhiNian的博客 1577

KMP算法解析

KMP算法 背景 在刷leetcode时,遇到了这样一个问题,给定两个字符串A和B,问你在A中是否有字符串B,并给出A中B出现的起始位置。 拿到这道题,首先想到的是使用暴力搜索的方法,直接在A中去搜索B,这种方法太暴力,当出现不匹配字符时,遍历A和B的指针需要同时回退,时间复杂度高,为O(m*n),其中m,n分别是字符串A和B的长度。而且,当字符串中重复的元素比较多时,这种解法会有很多不必要的操作...

BANANAML的博客 346

工作笔记05:imu、底盘车轮、单激光雷达外参校准(基于hdl_graph_slam建图和定位)

目录1. imu 校准1.1 IMU型号1.2 坐标定义1.2.1 大地坐标系(WGS84)1.2.2 当地地理坐标系(ENU)1.2.3 传感器坐标轴定义1.3 传感器校准2. 底盘车辆参数配置3. 单激光雷达校准参考文献 1. imu 校准 1.1 IMU型号 阅读IMU产品说明书,获得如下信息: Yesense YIS300 系列惯性传感系统 YIS300 系列包含: YIS300-U 惯性测量单元(IMU):输出经过校准的加速度和角速度值,同时也能够输出磁场强度信息。 YIS300-V 垂直参考系

穿林需独行的博客 4203

python docx设置标题中文字体rPr.rFonts.set(qn(‘w:eastAsia‘),u‘黑体‘),报错‘NoneType‘ object has no attribute ‘set‘

一、我的代码: 因为要编一个报告自动化生成的代码,所以用了python docx,在设置标题自己写了一段代码,要求将标题设置成:一级标题 黑体 小四 from docx import Document from docx.oxml.ns import qn from docx.shared import Pt def add_Head(document, level, text, font, size): # document word对象 # level 几级标题 # text 标题内容 # f

qq_40272386的博客 8845

CSUST 2002-Banana(回文树)

题目链接:http://acm.csust.edu.cn/problem/2002 博客园食用链接:https://www.cnblogs.com/lonely-wind-/p/13389433.html Description ppq最喜欢次banana了,可这和本题bing没有什么关系。 对于给定的一个字符串,求有多少对互不重叠的非空回文子串。 设给定一个字符串长度为lenlenlen,若两个回文串[l1,r1][l_1,r_1][l1​,r1​]和[l2,r2][l_2,r_2][l2​,r2​]满足

孤风的博客 480

【服务器电源架构与关键技术发展趋势】深度解析架构、方案、玩家与未来趋势

技术维度:台达 / 光宝在高功率密度(97%+ 效率)和垂直整合上领先,大陆厂商(麦格米特 / 欧陆通)在成本控制和快速响应上更优,国际厂商(英飞凌)聚焦核心器件突破。 客户维度:台达绑定英伟达核心供应链,麦格米特 / 欧陆通兼顾国内外客户,光宝 / 中恒电气侧重云端与互联网厂商。 趋势适配:所有厂商均加速布局 800V 高压架构、液冷技术和高功率 Power Shelf,以应对 AI 服务器单柜功率从 10kW→200kW 的升级需求。

昔时扬尘处 723

python求字符串中出现的第一个最长重复子串(如banana中最长重复子串为ana)

#字符串中出现的第一个最长重复子串 class commonsubstring(): def maxlen(self,s1,s2): #最长公共子串的长度 for i in range(min(len(s1),len(s2))): if s1[i]==s2[i]: i+=1 else: break return i def getMaxCom(s

qq_38773993的博客 659

unitree-G1外接 USB 麦克风完整配置指南

首先,将type-c麦克风插入G1机器人的USB口后,记录下USB麦克风的卡号(card)和设备号(device),通常显示为 card 1: Device [USB Audio Device]

m0_47999117的博客 589

Android系统开机时间分析与优化指南

本文系统阐述了Android开机时间优化的全流程技术方案。首先详细解析了从电源键按下到桌面显示的完整启动流程及关键事件序列,然后介绍了秒表计时、日志分析和自动化脚本三种测量方法。重点从底层和上层两个维度提出了具体优化措施:底层包括编译器优化、内核驱动裁剪和日志精简;上层涵盖系统服务参数调整、应用预优化和功能组件精简。最后提供了验证工具和方法,并强调优化需要在性能、功耗和功能间取得平衡。通过这套系统化方案,可有效提升Android设备的开机速度与用户体验。

学无止境 351

HDU 1069 Monkey and Banana(最大递增子串)

占坑(在上课所以先不写思路了) //#include<iostream> //#include<stdio.h> //using namespace std; //typedef unsigned long long uLL; //const uLL base1 = 131; //const uLL base2 = 233; //const int hmaxn=1005; ...

weixin_43331783的博客 164

ICML-2025《Learning from Sample Stability for Deep Clustering》

用于指导深度聚类模型的训练,从而提升模型对困难样本的学习能力,最终改善整体聚类性能。首先,利用K-means在原始样本(非增强)的表征上进行聚类,得到初始聚类分配。其目的是鼓励模型对同一稳定样本在连续epoch中产生相近的表征。输出差异大)会产生更大的损失值,从而引导模型优先优化这些困难样本。此损失借鉴了NT-Xent损失的思想,但将正样本对定义为。最后,通过对比学习优化聚类中心,将同一聚类在。为了获得更具代表性的聚类中心,论文提出。为了学习更鲁棒的表征,模型在在线网络。首先,论文定义了样本。

Christo的博客 827

jzoj2921. 【NOI2012模拟题】字符串识别(string) & jzoj4372. 【GDOI2016模拟】识别子串 (SAM优化)

题目描述 (其实两道题就是数据范围不一样) Description XX 在进行字符串研究的时候,遇到了一个十分棘手的问题。在这个问题中,给定一个字符串 S,与一个整数 K,定义 S 的子串 T=S(i, j)是关于第 K 位的识别子串,满足以下两个条件: 1、i≤K≤j。 2、子串 T 只在 S 中出现过一次。 例如,S=”banana”,K=5,则关于第 K 位的识别子串有”nan...

某司机的黑车 515

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

[后缀自动机]识别子串

题目描述 现在同学们把大多数作业都做完了,但是却被最后一个题给难住了。 一般地,对于一个字符串S,和S中第k个字符,定义子串T=S(i..j)为一个关于k的识别子串,当且仅当 1、i&lt;=k&lt;=j。 2、T在S中只出现一次。 比如,对于banana的第5个字符,“nana”,“anan”,“anana”,“nan”,“banan”和“banana”都是关于它的识别子串。 自然...

~NULL~ 736

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

字符串的子串的个数

字串:串中任意个连续的字符组成的子序列称为该串的字串。 空串属于字串 (1)长度为n的字符串,如果串中字符各不相同,则字串的个数为n(n+1)/2+1 解析: 包含1个字符的子串共n个 包含2个字符的子串共n-1个 包含3个字符的子串共n-2个 包含4个字符的子串共n-3个 .。。。。。 包含n个字符的子串共1个 空串1个 综上所述:子串个数共:1...

Shrimp_millet 6万+

字符串的子串个数

求字符串的字串个数这个问题是我们小组内训练时,求练习题的密码来的。 奈何自己水平太菜,求不出来,只好在网上找到大佬的代码参考,但是有的还是看不懂,先记下来,以后再参考,也为其他有需要的人提供方便。 **注:**代码转自网络。 #include <cstdio> #include <cstring> #include <algorithm> #define ll ...

weixin_45917441的博客 1507

判断字符串中子串个数

方法一:(来自万一老师)function GetSubStrNum(const SubStr,Str: WideString): Integer; var pw: PWideChar; i,SubLen: Integer; begin Result := 0; pw := PWideChar(Str); SubLen := Length(SubStr); while i >

wozengcong的专栏 3600

leetcode 子串(列出所有子串,无重复子串,重复子串)

1、列出字符串的所有子串 void getAllSubstring(string s,vector&lt;string&gt; &amp;res){ for (int i = 0; i &lt; s.size(); i++){ for (int j = 1; j &lt;= s.size()-i; j++){ res.emplace(s.substr(i, j)); } } ...

liugg2016的博客 7079

查找子串的个数并输出子串

/*************************************************************************    &gt; File Name: check.c    &gt; 作者: 赵森    # 邮箱: 1806131496@qq.com    &gt; Created Time: 2018年05月18日 星期五 10时28分04秒 *****11*...

a1806131496的博客 1196

最长重复子串

https://blog.youkuaiyun.com/xiaoyi357/article/details/70214367 华为笔试题: 思路: 使用两个指针,两个指针的间隔从1,2,3…依次增大, 同时向右移动两个指针,在移动的过程中判断指针位置的字符是否相同,并记录最长子串的长度。 参考: public static void main(String[] args) throw...

不远远方 1676

找出字符串中最长的重复子串(三种解法)

文中提出了三种:找出字符串中最长的重复子串的解法 比如 输入qweabcuwabcfw,输出结果为3 并且还能输出第二次出现abc的 a 的地址。

雪域之狼 2万+

【啊哈,算法】之十、后缀数组,求最长重复子串

转自:http://blog.youkuaiyun.com/hackbuteer1/article/details/7968623 直观的解法是,首先检测长度为 n - 1 的字符串情况,如果不存在重复则检测 n - 2, 一直递减下去,直到 1 。 这种方法的时间复杂度是 O(N * N * N),其中包括三部分,长度纬度、根据长度检测的字符串数目、字符串检测。 利用后缀数组 后缀数

编程之道,自强之路! 1981

【编程之美】读书笔记:寻找最大的K个数

目录(?)[-] 方法一:常规解法,先排序(时间复杂度为O(N*logN))方法二:利用快速排序原理(时间复杂度O(N*logK)(掌握)方法三:利用最小堆的原理(时间复杂度为O(N*logK))(掌握)方法四:二分法(在实际应用中效果不佳)方法五:用空间换取时间的方法                               问题:查找大量无序元素中最大的K个数。

xiaoding133的专栏【Stay hungry,Stay foolish】 3万+

双向链表的相关操作C++实现

对于循环双向链表 判断一个链表是否为空的条件为:head->next==head (头指针) 判断*p为最后一个节点的条件为:p->next=head #include using namespace std; /*双链表结构*/ typedef struct node { int data; struct node *prior; struct node *next; }DN

xiaoding133的专栏【Stay hungry,Stay foolish】 9505

【编程之美】读书笔记:寻找发帖水王

问题:传说,Tango有一大“水王”,他不但喜欢发帖还会回复其他ID发的每个帖子。该“水王”的帖子数目超过了帖子总数的一半,如何用快速的方法找出这个“水王”的ID?          分析:首先想到的是对所有的ID进行排序,然后再扫描一遍排好序的ID列表,统计各个ID出现的次数。如果某个ID的次数超过总数的一半,那么就输出这个ID。这个算法的时间复杂度为O(N*logN+N).

xiaoding133的专栏【Stay hungry,Stay foolish】 9112

【编程之美】读书笔记:寻找数组中的最大值和最小值

问题:对于一个由N个整数组成的数组,需要比较多少次才能把最大值和最小值的数找出来呢?                 解法一:将寻找数组中的最大值和最小值看成是两个独立的问题。分别求出最大值和最小值即可。这样需要2*N次的比较才能求出最大的数和最小的数。 void FindMinMax(int A[],int size,int &min,int &max) { min=A[0]; m

xiaoding133的专栏【Stay hungry,Stay foolish】 7810
上一篇: 【Programming Pearls】对文档中的单词进行计数问题
下一篇: 【Programming Pearls】查找所有的变位词
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值