今天刷最长公共前缀,大家有兴趣可以点上看看题目要求,试着做一下。
我们直接看题解吧:
方法很多:
方法一,直接遍历比较,采用横向或者纵向比较都是可以的。
方法二,利用Java/Python特点,将字符串按字典排序,比较首尾的单词即可。
其他大家有兴趣去可以去看看。
审题目+事例+提示:
个人感觉这道题目不够清晰严谨,公共是指两个单词以上存在相同的字母吗?字符串数组是要么都存在公共前缀要么都不存在吗?
思路(方法二):
1、判断是否为空串或者长度为0,是则返回““
2、将字符串按字典排序
3、创建字符数组a,b,将第一个单词与最后一个单词赋值分别赋值给字符数组。
4、循环遍历比较,条件选其中一个长度,判断选另一个
·相同就追加到字符串对象res中去
·没有相同的就break
5、最后返回字符串
代码:
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
StringBuilder res = new StringBuilder();
Arrays.sort(strs);
// 字符串转数组
char[] a = strs[0].toCharArray();
char[] b = strs[strs.length - 1].toCharArray();
for (int i = 0; i < a.length; i++) {
if (i < b.length && a[i] == b[i]) {
res.append(a[i]);
}
else{
break;
}
}
return res.toString();
}
}
注意:用到了,StringBuilder 类,array类;toArray(),tostring(),append(),sort()方法.
代码(方法一):
思路:
判断字符串是否为空,返回字符串
建一个公共字符串ans,并初始化第一个字符串strs[0]
循环遍历,逐一与ans比较,两层循环break
如果ans出现为空,则return ans
横向:
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0)
return "";
String ans = strs[0];
for(int i =1;i<strs.length;i++) {
int j=0;
for(;j<ans.length() && j < strs[i].length();j++) {
if(ans.charAt(j) != strs[i].charAt(j))
break;
}
ans = ans.substring(0, j);
if(ans.equals(""))
return ans;
}
return ans;
}
}
注意用了equals()、substring()函数
纵向:
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
int length = strs[0].length();
int count = strs.length;
for (int i = 0; i < length; i++) {
char c = strs[0].charAt(i);
for (int j = 1; j < count; j++) {
if (i == strs[j].length() || strs[j].charAt(i) != c) {
return strs[0].substring(0, i);
}
}
}
return strs[0];
}
}