背景

对算法一直应用的比较少,最近看到一些典型的算法想练练手,想看看到底有多么让人讨厌。其实发现算法都有一定的套路,一般并不是临时凭空想出来的,大都建立在一些已经存在的经典算法知识以及数据结构上。换句话来说,如果某些玩法之前未接触过,那么让你在短时间内临时想出来还是有一定难度的。这有点类似项目经验,如果曾经做过一个CRM系统,下次再碰到它时你就轻松很多,如果你挑战的是一个你从未遇到过的系统,你只能凭已有知识去强吃。
计算两个字符串最大公共子串
这个也是经常遇到到,给出两个任意长度的字符串,输出最大公有字符串,比如输入abcdef,cdef,则输出cdef。
解决方案
采用双层循环,指针移动来记录所有子串,最后取最大长度子串。利用临时队列来存储循环过程中匹配成功的字符元素,从两个字符串首个元素开始匹配。
示意图
从元素0开始比较
字符串A指针不动,B依次向后找至少找到相同的,将相同字符压入临时队列中。
出现第一个匹配元素
当出现匹配元素后,两个字符串均向后移动一个元素再做比较。
匹配出现中断
如果前面已经开始匹配成功,向后出现字符不相同时,终止。
重置索引,循环匹配
字符串B指针向后移动,字符串A的指针重置,递归上面的步骤。
示例代码
下面的示例将所有子串均记录下来,如果只想输出最大子串需要改下逻辑,定义一个最大子串,然后与循环计算的子串相比较,取两者长度最大值即可。
String b="abcdeqwe";
String a="cdeabrwqedeqwe";
int lengthA=a.length();
int lengthB=b.length();
//标识是否开始匹配
boolean match=false;
//循环中用于存储相同字符的临时队列
Queue tmpResult=new ArrayQueue();
//存储所有子串
List<Queue> result=new ArrayList<>();
for(int i=0;i<lengthA;i++){
int indexA=i;
for(int j=0;j<lengthB;j++){
if(a.charAt(indexA)==b.charAt(j)){
if(!match) {
match = true;
}
tmpResult.add(a.charAt(indexA));
if(indexA<lengthA-1) {
indexA++;
}
}
else {
if(match) {
result.add(tmpResult);
//重置条件
tmpResult=new ArrayQueue();
indexA=i;
}
}
if(j==lengthB-1||i==lengthA-1){
if(!tmpResult.isEmpty()){
result.add(tmpResult);
//重置条件
tmpResult=new ArrayQueue();
}
}
}
}
//取最大的子串
Queue stringResult= Collections.max(result, new Ordering<Queue>() {
@Override
public int compare(Queue left, Queue right) {
return Integer.compare(left.size(),right.size());
}
});
优点
指针移动在循环过程中不会产生多余的临时字符串,如果是substring方案就需要考虑效率了。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# 计算
# 字符串
# C语言中计算字符串长度与分割字符串的方法
# C#计算字符串哈希值(MD5、SHA)的方法小结
# Lua中计算、执行字符串中Lua代码的方法
# Shell脚本计算字符串长度和判断字符串为空小技巧
# Lua判断字符串中包含中文字符的方法和计算字符串宽度函数分享
# JavaScript实现计算字符串中出现次数最多的字符和出现的次数
# 利用PHP函数计算中英文字符串长度的方法
# PHP改进计算字符串相似度的函数similar_text()、levenshtein()
# JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
# C#和SQL实现的字符串相似度计算代码分享
# 有一定
# 想出
# 递归
# 清空
# 过程中
# 的是
# 如果你
# 让人
# 第一个
# 你就
# 已有
# 时间内
# 数据结构
# 不动
# 并将
# 做过
# 只想
# 已经开始
# 想看
# 句话
相关文章:
网站好制作吗知乎,网站开发好学吗?有什么技巧?
大连网站设计制作招聘信息,大连投诉网站有哪些?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
如何做网站制作流程,*游戏网站怎么搭建?
建站之星后台管理系统如何操作?
建站之星安装步骤有哪些常见问题?
如何在景安云服务器上绑定域名并配置虚拟主机?
创业网站制作流程,创业网站可靠吗?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
建站主机默认首页配置指南:核心功能与访问路径优化
哈尔滨网站建设策划,哈尔滨电工证查询网站?
如何确保西部建站助手FTP传输的安全性?
定制建站价位费用解析与套餐推荐全攻略
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何高效搭建专业期货交易平台网站?
如何在自有机房高效搭建专业网站?
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何在建站主机中优化服务器配置?
如何通过山东自助建站平台快速注册域名?
黑客如何通过漏洞一步步攻陷网站服务器?
网站制作免费,什么网站能看正片电影?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
如何用免费手机建站系统零基础打造专业网站?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
网站制作难吗安全吗,做一个网站需要多久时间?
如何用已有域名快速搭建网站?
建站之星云端配置指南:模板选择与SEO优化一键生成
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
如何规划企业建站流程的关键步骤?
如何在IIS中新建站点并配置端口与物理路径?
如何选择适合PHP云建站的开源框架?
如何选择PHP开源工具快速搭建网站?
如何通过虚拟主机快速完成网站搭建?
Bpmn 2.0的XML文件怎么画流程图
佛山网站制作系统,佛山企业变更地址网上办理步骤?
如何通过智能用户系统一键生成高效建站方案?
教学网站制作软件,学习*后期制作的网站有哪些?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
宁波自助建站系统如何快速打造专业企业网站?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
微信推文制作网站有哪些,怎么做微信推文,急?
平台云上自主建站:模板化设计与智能工具打造高效网站
北京制作网站的公司,北京铁路集团官方网站?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
视频网站制作教程,怎么样制作优酷网的小视频?
*请认真填写需求信息,我们会在24小时内与您取得联系。