leetcode第十四题
前言
继续划水做做看
参考
- string
- length
正文
看到这个就想用两个for跑,用一个string变量+=。
初始代码:
1 | class Solution { |
假设第一层for循环跑strs的个数,第二个跑str[i]的长度,那么如果需要比较的话就又得多一层循环,三层其实有点多了,不是很好的办法。
……想了半天,既然是前缀之间的比较,那么假设循环的长度根据strs[0].length()
,那么无论[0]的长度是最长还是最短,无非就三个结果,要么正好是他,要么是其中几个,要么都不是。
1 | for(int i = 0; i < strs[0].length(); i++){ //用str[0]作为对象与后面的比较 |
replace那些用起来比较麻烦的感觉,创建一个新的string变量,找到公共的就+=进去是暴力解法的第一步。
然后就是if的问题,我该怎么去判断,是和不是又该怎么处理。
如果说直接比较
1 | if(strs[0][i] == strs[j][i]) |
若是相等,直接让变量s+=strs[0][i],乍一看还是很合理的,让我们找个示例测试一下:
好家伙。。比strs[0]都长了。。逆天
整理了一下,问题在于s+=不应该在if里面,因为相等的时候,i还没有变,j倒是自增了,就导致重复+i的情况。
那也就是说s+的过程应该放在内循环外面
1 | for(int i = 0; i < strs[0].length(); i++){ //用str[0]作为对象与后面的比较 |
那么if如果==我们可以让他break掉,但是== 反而break,好像给别人看起来就会很怪异,那么就干脆修改成!=,这样应该就比较合理了。
1 | for(int i = 0; i < strs[0].length(); i++){ //用str[0]作为对象与后面的比较 |
再测试一下:
额,好像strs[1]比strs[0]要短哦,if好像还应该判断i有没有到达strs[j].lenght()
,如果已经到达了后者,那么前面也没必要在判断了,或者说后者比前者大时,i如果没到达strs[j].lenght()
,也不用着急停止。意味着我们的if应该是:
1 | if(strs[0][i] != strs[j][i] && i != strs[j].length()) |
在测试了一下发现结果还是一样的
拿去debug了一下。想起来break只是结束了内循环,s+还是生效了,所以如果符合if的条件时,我们应该让整个for都结束。能够达到这一类效果的应该就是直接return s;了
1 | class Solution { |
测试了两个示例结果都正常的,提交看看。
额小尴尬,解答错误了。
……又想了一圈,if里面应该是用或的,要么达到strs[j].length()
,要么就是两个不相等,所噶所噶。。今天脑子有点不好使。
把解答错误的案例塞进去试了一下:
。。。。。。坏事
哦哦哦。。应该是要么俩不相等,要么i==strs[j].lenght()
;表示它走到头了该断了。
1 | if(strs[0][i] != strs[j][i] || i == strs[j].length()) |
再次提交:
总算是过了。
最后修正:
1 | class Solution { |
结语
…简单的题目就挺折腾的了,而且c++有段时间不看,就忘了一些函数的用法了。。得回头补补了