14. 最长公共前缀
题目地址:https://leetcode.cn/problems/longest-common-prefix/
解题思路:
- C++:首先来说,看到这道题,肯定是想怎么样子去进行比较,只要不是空串那么每个字符串都会需要被比较,我最先的想法是:用第一个和后面的每个进行比较,然后每次截取最短的。这样当然能做,但是花费的时间较长。接下来,我尝试用 sort函数对 victor容器进行排序,这样就只需要比较第一个和最后一个了。这么做的话,在代码方面会轻松不少,但是他的排序仍然也需要消耗时间和空间。但是我们注意到 C++里面可以取到是字符串的下一位(也就是‘\0’,Java中就不行),因此我们可以循环对每个字符串的每个位置进行比较,这样所需的时间是相对较短的。
- Java:我想直接将 C++的代码改一下就放到 Java上,但是 Java不能直接取到对应字符位置的字符所以需要用 charAt函数进行取出,那么就取不到下一位了。也就是说会出现数组越界的情况那这种情况下,就必须取在之前的时候,每一次判断一下他的长度是多少,但是按我们做 C++时候的方法,也就是说总共比较的次数会是总字符串的长度乘以第一个字符串的长度,当然,这样的速度会比较慢。因此就考虑换一种方式,也就是用类似在 C++中的第一种解法。
参考代码:
// C++ 提交版 0ms 10.55mb
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0)
return "";
else if (strs.size() == 1)
return strs[0];
string ans;
for (int i = 0; i < strs[0].size(); i++)
{
char c = strs[0][i];
if (c == '\0')
return ans;
for (int j = 1; j < strs.size(); j++)
{
if (strs[j][i] != c)
return ans;
}
ans += c;
}
return ans;
}
};
// Java 提交版 0ms 40.34mb
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0)
return "";
else if (strs.length == 1)
return strs[0];
String ans = strs[0];
for (int i = 1; i < strs.length; i++)
{
ans = longestCommonPrefix(ans, strs[i]);
if (ans.length() == 0)
return ans;
}
return ans;
}
public String longestCommonPrefix(String str1, String str2) {
int n = Math.min(str1.length(), str2.length());
for (int i = 0; i < n; i++)
{
if (str1.charAt(i) != str2.charAt(i))
{
return str1.substring(0, i);
}
}
return str1.substring(0, n);
}
}
其他版本:
// C++ 版本一
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0)
return "";
else if (strs.size() == 1)
return strs[0];
string ans = strs[0];
for (string str: strs)
{
if (ans.size() > str.size())
ans = ans.substr(0, str.size());
for (int i = 0; i < str.size(); i++)
{
if (str[i] != ans[i])
{
ans = ans.substr(0, i);
break;
}
}
if (ans.size() == 0)
return "";
}
return ans;
}
};
// C++ 版本二
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0)
return "";
else if (strs.size() == 1)
return strs[0];
sort(strs.begin(), strs.end());
string ans = strs[0];
string tmp = strs.back();
for (int i = 0; i < ans.size(); i++)
{
if (tmp[i] != ans[i])
{
ans = ans.substr(0, i);
break;
}
}
return ans;
}
};
// Java 版本一
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0)
return "";
else if (strs.length == 1)
return strs[0];
String ans = "";
for (int i = 0; i < strs[0].length(); i++)
{
char c = strs[0].charAt(i);
if (c == '\0')
return ans;
for (int j = 0; j < strs.length; j++)
{
if (i >= strs[j].length() || strs[j].charAt(i) != c)
return ans;
}
ans += c;
}
return ans;
}
}
// Java 版本三(这个其实是我想尝试能不能合成一个函数,结果发现效率低一些)
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0)
return "";
else if (strs.length == 1)
return strs[0];
String ans = strs[0];
for (int j = 1; j < strs.length; j++)
{
int n = Math.min(ans.length(), strs[j].length());
ans = ans.substring(0, n);
for (int i = 0; i < n; i++)
{
if (ans.charAt(i) != strs[j].charAt(i))
{
ans = ans.substring(0, i);
break;
}
}
if (ans.length() == 0)
return ans;
}
return ans;
}
}
vocal 我这做题速度一天能做几道啊……