这位大哥总结得不错: juejin.cn/post/684490…
我自己刷的 :
1.最长回文串 中心扩散法:
public String getLongestPalindrome(String s) {
if (s == null || s.length() < 1) {
return s;
}
int maxStart = 0;
int maxEnd = 0;
for (int i = 0; i < s.length(); i ++) {
//主要理解回文串中字符为单数和双数的情况
int len1 = getLongestByCenter(s, i ,i);
int len2 = getLongestByCenter(s, i, i + 1);
int len = Math.max(len1, len2);
if (len > maxEnd - maxEnd) {
maxEnd = i + len/2;
maxStart = i - (len - 1)/2;
}
}
return s.substring(maxStart, maxEnd + 1);
}
//从中心向两边扩散真正寻找回文串
public int getLongestByCenter(String s, int left, int right) {
while (left > 0 && right < s.length()
&& s.charAt(left) == s.charAt(right)) {
left --;
right ++;
}
return right - left - 1;
}
2.kmp找A串中的第一个B串
//暂时还没理解到位
3.字符串的最长无重复字符子串
public int getLongestSubString(String s) {
int len = s.length();
int res = 0;
//key为字符,value为下标
Map<Character, Integer> map = new HashMap();
//i和j作为窗口的两个指针,map来存储窗口中的字符
for (int start = 0, j = 0; j < len; j++) {
if (map.containsKey(s.charAt(j))) {
//abba有可能start比map.get(s.charAt(j))大,i是不可能后退的
start = Math.max(map.get(s.charAt(j)), start);
}
res = Math.max(res, j - start + 1);
map.put(s.charAt(j), j + 1);
}
return res;
}
4.n对括号的所有合法可能https://leetcode-cn.com/problems/bracket-lcci/
5.Z 字形变换https://leetcode-cn.com/problems/zigzag-conversion/
6.求字符串数组的最长公共前缀
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
return longestCommonPrefix(strs, 0 , strs.length - 1);
}
private String longestCommonPrefix(String[] strs, int l, int r) {
if (l == r) {
return strs[l];
}
else {
int mid = (l + r)/2;
String lcpLeft = longestCommonPrefix(strs, l , mid);
String lcpRight = longestCommonPrefix(strs, mid + 1,r);
return commonPrefix(lcpLeft, lcpRight);
}
}
private String commonPrefix(String left,String right) {
int min = Math.min(left.length(), right.length());
for (int i = 0; i < min; i++) {
if ( left.charAt(i) != right.charAt(i) )
return left.substring(0, i);
}
return left.substring(0, min);
}