题目描述
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
1.横向比较
// 不用StringBiffer 用subString会更快
//s.substring(0,index) 获得的是0位开始index之前的subString
class Solution {
public static String longestCommonPrefix(String[] strs) {
int len = strs.length;
if(len == 0) return "";
if(len < 2) return strs[0];
String results =findSame(strs[0],strs[1]);
for(int i=2;i<len;i++){
results = findSame(results,strs[i]);
}
return results;
}
// public static String findSame(String str1, String str2) {
// StringBuffer stringBuffer = new StringBuffer();
// for(int i=0;i<Math.min(str1.length(),str2.length());i++){
// if(str1.charAt(i) == str2.charAt(i)){
// stringBuffer.append(str1.charAt(i));
// }else break;
// }
// return stringBuffer.toString();
// }
public static String findSame(String str1, String str2) {
int index =0;
for(int i=0;i<Math.min(str1.length(),str2.length());i++){
if(str1.charAt(i) == str2.charAt(i)) index =i+1;
else break;
}
return str1.substring(0,index);
}
}
2. 先排序,后比较头尾即可
class Solution {
public static String longestCommonPrefix(String[] strs) {
int len = strs.length;
if(len == 0) return "";
if(len < 2) return strs[0];
Arrays.sort(strs);
String results = findSame(strs[0],strs[len-1]);
return results;
}
public static String findSame(String str1, String str2) {
int index =0;
for(int i=0;i<Math.min(str1.length(),str2.length());i++){
if(str1.charAt(i) == str2.charAt(i)) index =i+1;
else break;
}
return str1.substring(0,index);
}
}
3.纵向比较
直接从第一个字符开始比较所有的字符串
4.分冶
最终把问题分解成小问题 最后成为两个字符串的最短前缀是多少
5.二分查找
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
// 寻找所有字符串里最短的
int minLength = Integer.MAX_VALUE;
for (String str : strs) {
minLength = Math.min(minLength, str.length());
}
// 根据最短字符穿的长度往回找
int low = 0, high = minLength;
while (low < high) {
int mid = (high - low + 1) / 2 + low;
if (isCommonPrefix(strs, mid)) {
low = mid;
} else {
high = mid - 1;
}
}
return strs[0].substring(0, low);
}
//这个方法是判断位字符位于第length位的数字 是否一样
public boolean isCommonPrefix(String[] strs, int length) {
String str0 = strs[0].substring(0, length);
int count = strs.length;
for (int i = 1; i < count; i++) {
String str = strs[i];
for (int j = 0; j < length; j++) {
if (str0.charAt(j) != str.charAt(j)) {
return false;
}
}
}
return true;
}
}