前言

继续划水做做看


参考

  • string
    • length

正文

看到这个就想用两个for跑,用一个string变量+=。

初始代码:

1
2
3
4
5
6
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {

}
};

假设第一层for循环跑strs的个数,第二个跑str[i]的长度,那么如果需要比较的话就又得多一层循环,三层其实有点多了,不是很好的办法。

……想了半天,既然是前缀之间的比较,那么假设循环的长度根据strs[0].length(),那么无论[0]的长度是最长还是最短,无非就三个结果,要么正好是他,要么是其中几个,要么都不是。

1
2
3
4
5
6
for(int i = 0; i < strs[0].length(); i++){      //用str[0]作为对象与后面的比较
for(int j = 1; j < strs.size(); j++){
if()

}
}

replace那些用起来比较麻烦的感觉,创建一个新的string变量,找到公共的就+=进去是暴力解法的第一步。
然后就是if的问题,我该怎么去判断,是和不是又该怎么处理。
如果说直接比较

1
2
if(strs[0][i] == strs[j][i])
s += strs[0][i];

若是相等,直接让变量s+=strs[0][i],乍一看还是很合理的,让我们找个示例测试一下:

好家伙。。比strs[0]都长了。。逆天

整理了一下,问题在于s+=不应该在if里面,因为相等的时候,i还没有变,j倒是自增了,就导致重复+i的情况。

那也就是说s+的过程应该放在内循环外面

1
2
3
4
5
6
7
for(int i = 0; i < strs[0].length(); i++){      //用str[0]作为对象与后面的比较
for(int j = 1; j < strs.size(); j++){
if(strs[0][i] == strs[j][i])

}
s += strs[0][i];
}

那么if如果==我们可以让他break掉,但是== 反而break,好像给别人看起来就会很怪异,那么就干脆修改成!=,这样应该就比较合理了。

1
2
3
4
5
6
7
for(int i = 0; i < strs[0].length(); i++){      //用str[0]作为对象与后面的比较
for(int j = 1; j < strs.size(); j++){
if(strs[0][i] != strs[j][i])
break;
}
s += strs[0][i];
}

再测试一下:

额,好像strs[1]比strs[0]要短哦,if好像还应该判断i有没有到达strs[j].lenght(),如果已经到达了后者,那么前面也没必要在判断了,或者说后者比前者大时,i如果没到达strs[j].lenght(),也不用着急停止。意味着我们的if应该是:

1
2
if(strs[0][i] != strs[j][i] && i != strs[j].length())
break;

在测试了一下发现结果还是一样的

拿去debug了一下。想起来break只是结束了内循环,s+还是生效了,所以如果符合if的条件时,我们应该让整个for都结束。能够达到这一类效果的应该就是直接return s;了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string s = "";

for(int i = 0; i < strs[0].length(); i++){
for(int j = 1; j < strs.size(); j++){
if(strs[0][i] != strs[j][i] && i != strs[j].length())
return s;
}
s += strs[0][i];
}

return s;
}
};

测试了两个示例结果都正常的,提交看看。

额小尴尬,解答错误了。

……又想了一圈,if里面应该是用或的,要么达到strs[j].length(),要么就是两个不相等,所噶所噶。。今天脑子有点不好使。
把解答错误的案例塞进去试了一下:

。。。。。。坏事

哦哦哦。。应该是要么俩不相等,要么i==strs[j].lenght();表示它走到头了该断了。

1
if(strs[0][i] != strs[j][i] || i == strs[j].length())

再次提交:

总算是过了。

最后修正:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string s = "";

for(int i = 0; i < strs[0].length(); i++){
for(int j = 1; j < strs.size(); j++){
if(strs[0][i] != strs[j][i] || i == strs[j].length())
return s;
}
s += strs[0][i];
}

return s;
}
};

结语

…简单的题目就挺折腾的了,而且c++有段时间不看,就忘了一些函数的用法了。。得回头补补了