编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。
提示:
- 1 <= strs.length <= 200
- 0 <= strs[i].length <= 200
- strs[i] 仅由小写英文字母组成
我的思路:
依题意,假设第一个元素为最大公共前缀,一次遍历,跟每一个单词进行比对,然后对最大公共前缀进行裁切,遍历完整个数组,剩下的就是最大公共前缀。
class Solution {
public String longestCommonPrefix(String[] strs) {
String str = strs[0];//假设第一个为最大公共前缀
for(int i = 1 ;i<strs.length;i++)//对最大公共前缀遍历裁切
{
str = com_prefix(str,strs[i]);
}
return str;
}
public String com_prefix(String a,String b)//判断两个字符串最大公共前缀
{
String str = "";
for(int i = 0; i<Math.min(a.length(),b.length()) ;i++)
{
if(a.charAt(i) == b.charAt(i))
str += a.charAt(i);
else
break;
}
return str;
}
}
可以看到,这个性能很一般,只超过了5.2%,我想想怎么优化一下。
我们可以看到这段代码
for(int i = 0; i<Math.min(a.length(),b.length()) ;i++)
{
if(a.charAt(i) == b.charAt(i))
str += a.charAt(i);
else
break;
}
这里使用了str += a.charAt(i);每循环一次,java底层就要创建一个StringBuilder对象,所有在循环中使用字符串+操作很耗时,耗费空间,我们修改一些代码试试
class Solution {
public String longestCommonPrefix(String[] strs) {
String str = strs[0];
for(int i = 1 ;i<strs.length;i++)
{
str = com_prefix(str,strs[i]);
}
return str;
}
public String com_prefix(String a,String b)
{
StringBuilder str = new StringBuilder();
for(int i = 0; i<Math.min(a.length(),b.length()) ;i++)
{
if(a.charAt(i) == b.charAt(i))
str.append(a.charAt(i));
else
break;
}
return str.toString();
}
}
代码效率有了很明显的提高