题解 | #查找两个字符串a,b中的最长公共子串#

查找两个字符串a,b中的最长公共子串

https://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506

题目:

提取两个字符串中最大的公共子串,并输入(先考虑求出最大子串)

动态规划思路:

1、先简单后复杂都是解题的常规思路,首先想到两个字符串都很小的情况,比如字符串长度为1,然后考虑复杂的情况。如果两个字符串都在变,思考起来肯定很乱,那我们先固定一个,比如x串的长度固定为1,y串长度未知,可能为1到n。

//场景一
String x = "a";
String y = "acabcaefabc"

假如情况如上,那么最大子串,结果是在y串索引为0,2,5,8长度为1的串。不管y串有多长,这个求解过程就是把y串中每个字符与a比较(因为x的子串就只有a一个)

2、现在加入a不固定了,它长度可能是1,2,3.......n中的一个,那我们该怎么求,假设如下场景二

//场景二
String x = "ab";
String y = "acabcaefabb"

那么这个情况怎么求呢?x串的子串有a,ab,b三种情况,如果是穷举,那么就太耗性能了,我们可以结合上一个场景考虑。

a串和b串的求解方法用场景一的就可以,这里就不考虑。

ab串才是关键,因为它是x中拿的一个子串,所以只要去y串找,就知道是不是公共子串。方式呢?其实只需要在y串中找b字符,找到了看一下它前面是不是a,如果是那么ab是公共子串。那关键来了,怎么知道b的位置前面是不是a呢?

   //动态推导
	//假设在场景一的时候给y串找到位置打上一个标记,1代表找到了a,同时也表示现在的最大子串是1
   a-c-a-b-c-a-e-f-a-b-b
   1-0-1-0-0-1-0-0-1-0-0 
   
 	//先找到b
   a-c-a-b-c-a-e-f-a-b-b
   0-0-0-1-0-0-0-0-0-1-1
 	//在找到的b时,去加上前一个位置的标记值,如果为2,那么说明前一个位置是a
     1-0-1-0-0-1-0-0-1-0-0 
+    0-0-0-1-0-0-0-0-0-1-1
=	 1-0-1-2-0-1-0-0-1-2-1
	//其实就是找b,找到b时打个标记1,这个标记需要加上前一个位置上的值(这个值是找a时打上的标记值)
	//如果还有c,就是找c,找到c后打个标记1,然后加上前一个位置的值(这个值是找b时打上的标记)

3、状态转移方程

假设f[i][j]表示x串的前i个字符,和y串的前j个字符,之间的最大公共子串长度值。

那么根据前面分析的,找不到,那不管,f[i][j] = 0;也就不处理(数组初始化为0);

找的到,那么它就是 1 加上找前一个字符时的标记值。这个值其实最大长度。

状态转移方程就是:f[i][j] = f[i-1][j-1]

例如刚才找b时,b = 1,表示前面一个字符不是a,如果子串包括这个b的话,子串最大长度只能是1;

b = 2,表示前一个字符为a,如果子串包括当前这个b的话,子串最大是2。

 for(int i = 1;i < x.length; i++){
            for(int j = 1;j < y.length; j++){
                if(x[i] == y[j]){
				  
                    num[i][j] = 1 + num[i -1][j- 1];
				  
				   //下面这步是收集最大长度值,只有大于上一次存的最大值才处理
                    if(num[i][j]>max){
                        max = num[i][j];
                        start = i-max;
                    }
                }
            }
        }

全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务