这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战
leetcode 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
解题:要查找一个字符串数组内的最长公共前缀,首先这个子字符串得是前缀,然后还得是公共的(就是每个字符串都有),最后还得是最长的。既然是公共的,那么就想办法每次都取出字符串数组里面所有字符串的第一、二、三、n个字符,比较取出的每一批字符,相当于把这个字符串数组列队排好,第一个字符串在第一排,第二个字符串在第二排,以此类推。每次就可以查看第一列(也就是每一排的第一个位置)是不是一样的,一直玩下找第二列、第三列这样,直到发现有一列空了一个位置,或者该列并不完全一样,那么在这之前的每一列都是一样的,就在这里截断获取到的就是最长公共前缀。
public String longestCommonPrefix(String[] strs) {
int index = 0;
Set<Character> characters = new HashSet<>();
while (true) {
// 每次取出数组内所有字符串的 第一、二、三、n个元素
// 比较第一批 第二批 的所有字符,遇到有一个不同 那么在这之前的就是最长公共串
for (String str : strs) {
// 超长了 完蛋
if (index > str.length() - 1) {
return index == 0 ? "" : str.substring(0, index);
}
// 取出第n个元素
characters.add(str.charAt(index));
// 遇到不相等的了
if (characters.size() > 1) {
return index == 0 ? "" : str.substring(0, index);
}
}
index++;
characters.clear();
}
}
或者先取出第一个字符串(题目保证数组长度>=1),用第一个字符串和下一个字符串比较,查出这两个字符串的公共前缀,在拿这个前缀去和下一个字符串比较获取公共前缀,这里两两比较最后获取到的的公共前缀就是最长公共前缀。
public String longestCommonPrefix(String[] strs) {
// 取出数组的第一个字符串(题目保证数组长度>=1)
String str = strs[0];
// 拿到一个字符串和后面一个字符串比较 获取公共子串
// 得到这个公共子串 在和后面一个字符串比较 获取公共子串
for (int i = 1; i < strs.length; i++) {
// 下一个字符串
String strTemp = strs[i];
int index = 0;
// 以最小长度为准
int len = Math.min(str.length(), strTemp.length());
// 如果没有超长 并且 前缀的字符还是一样 就继续往下一个位置
while (index < len && str.charAt(index) == strTemp.charAt(index)) {
index++;
}
// 保存好公共前缀
str = str.substring(0, index);
}
return str;
}