背景

对算法一直应用的比较少,最近看到一些典型的算法想练练手,想看看到底有多么让人讨厌。其实发现算法都有一定的套路,一般并不是临时凭空想出来的,大都建立在一些已经存在的经典算法知识以及数据结构上。换句话来说,如果某些玩法之前未接触过,那么让你在短时间内临时想出来还是有一定难度的。这有点类似项目经验,如果曾经做过一个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实现的字符串相似度计算代码分享
# 有一定
# 想出
# 递归
# 清空
# 过程中
# 的是
# 如果你
# 让人
# 第一个
# 你就
# 已有
# 时间内
# 数据结构
# 不动
# 并将
# 做过
# 只想
# 已经开始
# 想看
# 句话
相关文章:
开封网站制作公司,网络用语开封是什么意思?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
免费网站制作appp,免费制作app哪个平台好?
江苏网站制作公司有哪些,江苏书法考级官方网站?
如何选购建站域名与空间?自助平台全解析
定制建站价位费用解析与套餐推荐全攻略
如何快速搭建高效香港服务器网站?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
建站之星如何助力企业快速打造五合一网站?
如何通过FTP服务器快速搭建网站?
如何快速使用云服务器搭建个人网站?
建站之星与建站宝盒如何选择最佳方案?
建站主机无法访问?如何排查域名与服务器问题
如何通过虚拟主机空间快速建站?
大同网页,大同瑞慈医院官网?
Swift开发中switch语句值绑定模式
如何在阿里云香港服务器快速搭建网站?
建站之星logo尺寸如何设置最合适?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
大连 网站制作,大连天途有线官网?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
大连网站制作公司哪家好一点,大连买房网站哪个好?
如何通过VPS建站实现广告与增值服务盈利?
如何续费美橙建站之星域名及服务?
建站之星免费模板:自助建站系统与智能响应式一键生成
如何在橙子建站上传落地页?操作指南详解
高端云建站费用究竟需要多少预算?
如何通过山东自助建站平台快速注册域名?
怎么将XML数据可视化 D3.js加载XML
建站之星展会模板:智能建站与自助搭建高效解决方案
如何选择PHP开源工具快速搭建网站?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
如何快速生成ASP一键建站模板并优化安全性?
如何做网站制作流程,*游戏网站怎么搭建?
Java解压缩zip - 解压缩多个文件或文件夹实例
宁波免费建站如何选择可靠模板与平台?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
高防服务器租用如何选择配置与防御等级?
焦点电影公司作品,电影焦点结局是什么?
文字头像制作网站推荐软件,醒图能自动配文字吗?
建站之家VIP精选网站模板与SEO优化教程整合指南
如何通过wdcp面板快速创建网站?
python的本地网站制作,如何创建本地站点?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
如何挑选高效建站主机与优质域名?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
建站之星后台管理:高效配置与模板优化提升用户体验
建站之星后台管理系统如何操作?
*请认真填写需求信息,我们会在24小时内与您取得联系。